
【免费下载链接】thebookofshadersStep-by-step guide through the abstract and complex universe of Fragment Shaders.项目地址https://gitcode.com/gh_mirrors/th/thebookofshaders点击查看免费下载导读mediump是 GLSLOpenGL 着色语言中的精度限定符precision qualifier用于声明着色器变量在存储与计算时所需满足的最小精度要求。在 The Book of Shaders 这一面向片段着色器Fragment Shader的入门项目中mediump是出现频率最高的精度配置仓库中几乎所有.frag示例如 hello_world.frag都以precision mediump float;开头。读完本文你将理解精度限定符的语法与取值范围、mediump与lowp/highp的差异以及精度选择对渲染性能与画质的影响并能正确地在自己的着色器中声明浮点精度。mediump 是什么定义与定位根据 The Book of Shaders 的术语表见 glossary/mediump/README-ua.mdmediump是一种精度限定符通常在着色器文件的开头声明。它向编译器声明所有使用对应类型的变量在存储时必须满足**最小范围range与最小精度precision**的要求。precision mediump float; precision mediump int;这两行分别表示所有float浮点变量使用中等精度存储所有int整型变量使用中等精度存储。精度限定符的完整集合由 glossary/precision/README-ua.md 定义共有三档——lowp、mediump、highp。数值范围mediump 的 16 位保证mediump的核心承诺是16 位以上16 bits的存储精度其保证的具体数值范围如下与 lowp、highp 的完整对比见下表精度限定符存储位数float取值范围int取值范围lowp8 位-2 到 2-2^8 到 2^8mediump16 位-2^14 到 2^14-2^10 到 2^10highp32 位-2^62 到 2^62-2^16 到 2^16注意这是最低保证值。实际硬件尤其是桌面 GPU可能提供比该保证更高的精度即mediump在部分设备上可能表现为与highp相同或接近的精度。因此mediump承诺的是至少 16 位的能力下限而非精确的位宽实现。上表数据分别来源于仓库术语表 glossary/mediump/README-ua.md、glossary/lowp/README-ua.md 与 glossary/highp/README-ua.md。语法详解在哪里声明、如何生效precision语句的完整语法为precision 精度限定符 类型;类型可选float或int例如precision lowp float; // 低精度浮点 precision mediump float; // 中等精度浮点WebGL/移动端最常用 precision highp float; // 高精度浮点 precision lowp int; // 低精度整型 precision mediump int; // 中等精度整型 precision highp int; // 高精度整型按 GLSL 规范精度限定符声明具有作用域scope如果写在全局位置所有函数之前则对整个着色器中的后续变量生效也可以写在某个函数内部或变量声明之前实现局部精度覆盖。精度限定符既可以控制默认精度precision声明也可以直接修饰单个变量例如mediump vec3 color;。一个关键背景为什么片段着色器必须显式声明在 The Book of Shaders 的 第二章“Hello World” 中明确说明GL_ES宏通常在代码被移动设备与浏览器编译时定义。因此仓库中的着色器一律采用如下防御式写法#ifdef GL_ES precision mediump float; #endifGLSL ES嵌入式系统着色语言规范并不保证片段着色器拥有默认的浮点精度因此在面向 WebGL、移动端 GPU 的编译场景下必须通过#ifdef GL_ES检测后显式声明precision mediump float;否则着色器可能无法编译。这也是 The Book of Shaders 全仓库示例的统一范式。仓库实测mediump 在 The Book of Shaders 中的真实用法precision mediump float;并非孤立于术语表的概念而是贯穿全书所有示例的实际代码。以下是仓库中的典型实证02/hello_world.frag——全书的第一个着色器#ifdef GL_ES precision mediump float; #endif uniform float u_time; void main() { gl_FragColor vec4(1.0,0.0,1.0,1.0); }03/space.frag与 03/time.frag空间与时间输入章节#ifdef GL_ES precision mediump float; #endif uniform vec2 u_resolution; uniform vec2 u_mouse; uniform float u_time; void main() { vec2 st gl_FragCoord.xy/u_resolution; gl_FragColor vec4(st.x,st.y,0.0,1.0); }04/openFrameworks/bin/data/shader.frag、04/processing/data/shader.frag 与 04/sfml/data/shader.fragopenFrameworks / Processing / SFML 三套框架的移植示例同样沿用该范式。从源码结构可以推断The Book of Shaders 将mediump作为全书的默认精度基线——它兼顾了移动端 GPU 的运算效率与绝大多数场景下的画质需求是够用且快的折中选择。而 00/cmyk-halftone.frag、05/cubicpulse.frag 等各章节示例也全部保持这一约定说明这是本书面向读者的统一最佳实践。为什么选 mediump精度、性能与画质的权衡The Book of Shaders 在 02/README.md 中点明了精度选择的根本动机浮点类型在着色器中至关重要因此精度水平是关键。更低的精度意味着更快的渲染但以画质为代价。这意味着实际开发中的选择逻辑是lowp8 位追求极致渲染速度但浮点范围极小float仅 -2 到 2极易出现可见的带状色阶banding与精度伪影仅适合对颜色精度要求极低的简单场景mediump16 位速度与画质的平衡点也是移动端 GPU如早期 Mali、Adreno 等嵌入式 GPU 的片段着色器最常见的默认能力因此成为 The Book of Shaders 的默认选择highp32 位接近桌面 GPU 原生精度画质最佳、开销最大且在部分旧款移动设备上可能不受片段着色器支持——这一点从仓库中 glossary/highp/README-ua.md 将其列为独立词条、与lowp/mediump并置即可见其在移植场景中的敏感性。精度之外的陷阱GLSL 不做自动类型转换与mediump直接相关的还有另一个实战要点——GLSL 规范不保证变量会被自动类型转换。The Book of Shaders 在 02/README.md 中特别警告各厂商为加速 GPU 运算采取了不同的实现策略而自动类型转换并不在最低保证规格之列。当vec4期望浮点精度时必须显式传入带小数点的float字面量否则可能编译失败void main() { gl_FragColor vec4(1,0,0,1); // 错误整型字面量不保证可用 }正确写法是为所有浮点字面量加上小数点void main() { gl_FragColor vec4(1.0, 0.0, 0.0, 1.0); // 正确 }结合精度限定符来理解声明precision mediump float;后float变量按 16 位存储而传入整型字面量则可能触发类型不匹配的编译错误。写好精度声明、写对字面量格式是写出可移植、不出现白屏编译失败着色器的两个基本功。常见问题速查Q1fragment shader 里忘写precision mediump float;会怎样在GL_ES移动端/浏览器/WebGL编译环境下可能直接编译失败表现为屏幕空白。仓库的#ifdef GL_ES防御式写法正是为此而设。Q2mediump和highp能混用吗可以。精度声明具有作用域可在不同代码块内使用不同精度但要注意混用可能导致隐式精度提升/降低影响性能与结果可预测性。实践上建议以mediump为全局默认仅对确有需要的变量单独提升精度。Q3int型变量也要声明精度吗可选。precision mediump int;将整型默认精度设为中等整型计算不受浮点尾数精度影响但在涉及int与float混合运算时其取值范围-2^10 到 2^10仍值得留意避免溢出。相关术语导航mediump属于精度限定符体系的一部分建议连同以下词条一起阅读均位于仓库glossary/目录lowp 词条8 位float范围 -2 到 2int范围 -2^8 到 2^8highp 词条32 位float范围 -2^62 到 2^62int范围 -2^16 到 2^16precision 词条三档精度限定符的总览与完整取值对照入门示例02/hello_world.frag 与 02/README.md 中对精度与GL_ES宏的首次讲解。总结mediump是 GLSL 精度限定符体系中的中间档承诺 16 位存储精度、float范围 -2^14 到 2^14、int范围 -2^10 到 2^10。在 The Book of Shaders 中它以#ifdef GL_ES / precision mediump float;的统一范式出现在全书每个片段着色器示例中成为移动端与浏览器环境下的默认精度基线。理解mediump的数值边界、与lowp/highp的取舍关系以及 GLSL 不自动转换类型的陷阱是写出高质量、可移植着色器的第一课。赞分享【免费下载链接】thebookofshadersStep-by-step guide through the abstract and complex universe of Fragment Shaders.项目地址https://gitcode.com/gh_mirrors/th/thebookofshaders点击查看免费下载相关推荐The Book of Shaders 精读GLSL precision 精度限定符lowp / mediump / highp详解The Book of Shaders 精读GLSL precision 精度限定符lowp / mediump / highp详解 导读 在《The BThe Book of Shaders 术语精讲GLSL attribute 顶点属性限定符The Book of Shaders 术语精讲GLSL attribute 顶点属性限定符 本指南聚焦 The Book of Shaders 开源仓库Android 官方培训中文版使用 Android Beam 文件传输向其他设备发送文件Android 官方培训中文版使用 Android Beam 文件传输向其他设备发送文件 Android Beam 文件传输Android Beam fil上一篇ARIS Proof Checker 实战指南基于跨模型对抗评审的数学证明自动化验证与修复工作流下一篇StackExchange.Redis 性能剖析指南基于 v1 Profiling API 的计时采集与上下文分组实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考