第十一节—关于着色器程序中的精度
本文为L_Ares个人写作,包括图片皆为个人亲自操作,如需转载请表明原文出处。
在shader的两个文件中,有的变量定义了lowp
这个属性,那么就需要知道,这个属性到底是做什么用的。
它是修饰变量的精度的,代表着低精度。那么肯定就有高精度和中精度。这些精度被称作精度限定符。
没有精度修饰符的类型:字符常量,布尔型。
当浮点数和整数构造器不含有带精度修饰符的参数时,也不需要精度修饰符。
精度范围
浮点型精度范围:
-
highp :
-
mediump :
-
lowp :
整型精度范围:
-
highp :
-
medium :
-
lowp :
对于整型精度来说,高精度和中精度整型范围都可以转化相同精度修饰符表示的float型。例如:highp int
可以换成highp float
,mediump int
也可以换成mediump float
,但是低精度不行,因为浮点型的低精度范围没有整型范围大。
如何书写精度修饰符
精度修饰符要放在类型的前面。例如:
highp vec4 position
高精度四维向量position
varying medium vec4 color
可传递的中精度四维向量color
lowp float number
低精度浮点型number
默认精度修饰符
如果要在着色器中设定默认的精度,则一定要写在源码的起始位置。
指定默认的精度修饰符的方法如下:
precision precision-qualifier type;
其中,
-
precision
可以用来确定默认修饰符。 -
precision_qualifier
只能是highp
,mediump
,lowp
三个修饰符选一个,不能是其他的类型和修饰符,否则会报错。 -
type
则是类型,这个类型声明了所有本类型的参数或者说变量都将遵循precision_qualifier
指定的精度。无论是全局变量,函数返回值,函数参数,本地变量,只要是本类型,都遵循离它最近的指定的precision_qualifier
精度。
例如:
precision highp float
默认float类型值都是高精度
precision mediump int
默认int类型值都是中精度
着色器中默认预设的精度修饰符
VertexShader
也就是顶点着色器中的float
和int
都是有默认的精度修饰符highp
的。如果不想修改,也是可以的。
但是,FragmentShader
片元着色器,float
类型是没有默认精度的,所以必须为FragmentShader
中的float
类型的指定一个默认的精度修饰符。或者在每一个float
前面都添加精度修饰符。
在VertexShader
顶点着色器中,有如下的预定义的全局默认精度修饰符:
precision highp float
; //浮点型默认高精度
precision highp int
; //整型默认高精度
precision lowp sampler2D
; //2维纹理采样器默认低精度
precision lowp samplerCube
//Cube贴图纹理采样器默认低精度
在FragmentShader
片元着色器中,有如下的预定义全局默认精度修饰符
precision mediump int
; //整型默认中精度
precision lowp sampler2D
; //2维纹理采样器默认低精度
precision lowp samplerCube
; //Cube贴图纹理采样器默认低精度
所以从预设中也可以看出,为什么FragmentShader
中浮点型需要设置全局默认或者每个都要设置精度了,着色器默认预设中没有float
类型的精度。