OpenGL ES

第十一节—关于着色器程序中的精度

2020-09-22  本文已影响0人  L_Ares

本文为L_Ares个人写作,包括图片皆为个人亲自操作,如需转载请表明原文出处。

在shader的两个文件中,有的变量定义了lowp这个属性,那么就需要知道,这个属性到底是做什么用的。

它是修饰变量的精度的,代表着低精度。那么肯定就有高精度和中精度。这些精度被称作精度限定符。

没有精度修饰符的类型:字符常量,布尔型。

当浮点数和整数构造器不含有带精度修饰符的参数时,也不需要精度修饰符。

精度范围

浮点型精度范围:

整型精度范围:

对于整型精度来说,高精度和中精度整型范围都可以转化相同精度修饰符表示的float型。例如:highp int可以换成highp floatmediump int也可以换成mediump float,但是低精度不行,因为浮点型的低精度范围没有整型范围大。

如何书写精度修饰符

精度修饰符要放在类型的前面。例如:

highp vec4 position 高精度四维向量position
varying medium vec4 color可传递的中精度四维向量color
lowp float number 低精度浮点型number

默认精度修饰符

如果要在着色器中设定默认的精度,则一定要写在源码的起始位置。

指定默认的精度修饰符的方法如下:

precision precision-qualifier type;

其中,

例如:

precision highp float 默认float类型值都是高精度
precision mediump int 默认int类型值都是中精度

着色器中默认预设的精度修饰符

VertexShader也就是顶点着色器中的floatint都是有默认的精度修饰符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类型的精度。

上一篇 下一篇

猜你喜欢

热点阅读