我最近在看一些WebGL相关的教程,教程里面在片元着色器中经常会发现这一行的代码定义:
precision mediump float;
我找了些资料,说是告诉GPU处理该着色器要使用的浮点精度。反正我似懂非懂
如果我去掉这行代码,貌似又没什么变化。谁能告诉下这个定义是啥意思?
我最近在看一些WebGL相关的教程,教程里面在片元着色器中经常会发现这一行的代码定义:
precision mediump float;
我找了些资料,说是告诉GPU处理该着色器要使用的浮点精度。反正我似懂非懂
如果我去掉这行代码,貌似又没什么变化。谁能告诉下这个定义是啥意思?
你说的没错,这行代码决定了GPU在计算浮点数时使用的精度。Highp是高精度,当然比mediump(中等精度)和lowp(低精度)更加精确。
但是有些系统根本不支持high(高精度),这会导致定义高精度的代码在这些系统上根本无法运行。
甚至会看到性能受到比较大影响,因此应该尽可能使用mediump(中等精度)和low(低精度)。有个比较好的经验规则可以参考下:
顶点位置可以使用high(高精度),
纹理坐标可以使用medium(中等精度);
颜色可以使用low(低精度),当然如果Texture Format是浮点就不能定义为低精度了。
在GLSL(OpenGL Shading Language)中,precision
关键字用于指定浮点数和整数变量的精度。精度限定符分为三种:lowp
、mediump
和 highp
。
lowp
(低精度):通常用于颜色值,占用较少的存储空间,计算速度较快,但精度较低。mediump
(中等精度):适用于需要比lowp
更高精度的情况,同时保持较好的性能。highp
(高精度):提供最高精度,但可能会影响性能,并且并非所有设备都支持高精度。precision mediump float;
这一行代码表示你在当前的着色器程序中声明的所有浮点数变量都将使用中等精度。这可以节省GPU资源,提高渲染速度,特别是在移动设备上。
如果你删除了precision mediump float;
这一行代码,编译器会使用默认的精度设置。对于某些平台,默认的精度可能是highp
,但在某些移动设备上,默认的精度可能是lowp
或 mediump
。因此,最好显式地指定你需要的精度,以确保代码在不同的平台上表现一致。
总结一下,precision mediump float;
的作用是告诉编译器使用中等精度的浮点数来处理你的着色器程序中的所有浮点数变量。这有助于优化性能并保持不同平台之间的一致性。