OpenGL ES 3.0编程指南:第五章. OpenGL ES Shading Language --- (六)

19. Precision Qualifiers (精度限定符)

精度限定符可以指明shader中变量的精度,变量可以声明为 低、中、高三张精度。这些限定度提示编译器允许在较低的范围和精度上执行计算,在较低的精度上,有些实现可以运行的更有效率。当然,这种效率的提升是以精度为代价的,不合理的使用精度限定符有可能导致出现伪像。
注意,不是所有的实现都支持多种精度,所以有些实现会忽略精度限定符,并按照高精度来进行计算。

精度限定符用来声明任何基于浮点数或整数的变量的精度,分别用lowp、mediump、highp来声明低、中、高三种精度:

highp vec4 position;
varying lowp vec4 color;
mediump float specularExp;

如果一个变量没有声明精度,那么它使用的就是默认精度,默认精度在shader的顶部声明:

precision highp float;
precision mediump int;

在顶点shader中,如果没有声明默认精度,那么float类型和int类型的变量的精度都使用的是highp。但是,在片段shader中,必须声明float类型的默认精度,或者为每个float变量单独声明精度。

最后要注意的是,精度限定符声明的精度,是特定于实现的范围和精度,例如在PowerVR SGX GPU上,一个lowp float变量用10位的定点格式来表示(a 10-bit fixed point format),一个mediump float变量是一个16位的浮点值(a 16-bit floating-point value),一个highp float是一个32位的浮点值(a 32-bit floating-point value)。

20. Invariance (不变性)

编译器编译shander时,可能会进行优化,从而导致指令重新排序。这种指令重排意味着两个shader之间的等价计算不能保证产生完全相同的结果。这种不一致性在多通道着色效果时,由于精度差异可能会出现伪像。通常表现为“深度冲突”(Z fighting),每一个像素的深度值(Z)的精度的差异会导致每次着色相互之间有微小的偏移。

Invariant关键字用来修饰顶点shader的输出变量,指明用来计算输出变量的相同计算过程产生的值必须完全相同。Invariant关键字可以在变量声明时使用,也可以用于已经声明的变量:

invariant gl_Position;
invariant texCoord;

一旦某个输出变量声明了不变性,那么编译器便会保证相同的计算和输入会产生相同的结果。同时,也可以指定所有的变量全都不变:

#pragma STDGL invariant(all)

注意,编译器如果要保证结果的不变性,就有可能限制它做的优化。所以,只在必要时才使用invariant限定符,否则可能会导致性能下降。还要注意,虽然不变性表示在给定的GPU上的计算会产生相同的结果,但是并不意味着不同实现之间的计算结果会相同。

你可能感兴趣的:(OpenGL ES 3.0编程指南:第五章. OpenGL ES Shading Language --- (六))