我学习WebGL。下一个着色器工作正常:
// vertex.shader
// precision mediump float;
attribute vec4 a_Position;
attribute float a_PointSize;
void main(){
gl_Position = a_Position;
gl_PointSize = a_PointSize;
}
和
// fragment.shader
precision mediump float;
uniform vec4 u_FragColor;
void main(){
gl_FragColor = u_FragColor;
}
为什么必要为片段着色器设置精确度?顶点着色器在没有此功能的情况下工作,但片段着色器在没有此代码行的情况下不起作用(如我所见)。为什么存在不同的行为?
之前我读过this,但它对我没有帮助。
答案 0 :(得分:17)
在顶点着色器中,如果未显式设置浮点类型的默认精度,则默认为highp
。但是,如果片段着色器也默认为highp
,那么这将导致问题,因为OpenGL ES 2.0不会要求支持片段着色器阶段中的高精度浮点类型。
OpenGL ES Shading Language - 4.变量和类型 - 第35-36页
片段语言没有浮点类型的默认精度限定符。因此浮动,漂浮 点向量和矩阵变量声明,声明必须包含精度限定符或 必须事先声明默认的float精度。
4.5.4可用精度限定符
内置宏
GL_FRAGMENT_PRECISION_HIGH
定义为支持片段语言highp
精度的系统上的一个
#define GL_FRAGMENT_PRECISION_HIGH 1
并且未在片段语言中不支持
highp
精度的系统上定义。定义时,此宏在顶点和片段语言中都可用。highp
限定符是片段语言中的可选功能,#extension
未启用。
答案 1 :(得分:10)
简单的答案是规范没有为片段着色器定义默认的浮点精度,所以你必须自己指定它。
我一直认为没有违约是奇怪的。其他一切都有默认精度。默认设置不能为highp
,因为片段着色器无法保证其可用。但是,我没有看到为什么默认情况下它不能mediump
的充分理由。 mediump
是int
的默认值,也可以是float
。
在规范的第10节("问题")中,解释变得相当清楚。本节包含在讨论规范时打开的各种问题,然后回答。通常有一些解释可以解释为什么选择答案。
特别是" 10.3精密限定符"对此进行处理。其中一个问题和答案(第85页)是:
是否应该有默认精度?将默认顶点精度指定为当前指定的高度是有意义的。关于片段方的默认精度应该是什么没有达成一致。
RESOLUTION:顶点着色器的highp,片段着色器没有默认精度。
我认为其中的关键部分是:"没有达成协议" 。听起来他们想要定义一个默认精度,但是不同的供应商无法就它应该是什么达成一致,而且它们已经陷入僵局,最终根本没有定义一个。