我学习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;
}
为什么必须为片段着色器设置精度?没有此功能,顶点着色器就可以工作,但是没有此代码行,片段着色器就无法工作(如我所见)。为什么存在不同的行为?
我之前读过这篇文章,但对我没有帮助。
在顶点着色器中,如果未显式设置浮点类型的默认精度,则默认为highp
。但是,如果片段着色器也默认设置highp
为默认值,则会导致问题,因为OpenGL ES 2.0在片段着色器阶段不需要支持高精度浮点类型。
OpenGL ES着色语言 -4.变量和类型-第35-36页
片段语言没有浮点类型的默认精度限定符。因此,对于浮点,浮点向量和矩阵变量声明,声明必须包括精度限定符,或者必须事先声明默认的浮点精度。
4.5.4可用的精密预选赛
内置宏
GL_FRAGMENT_PRECISION_HIGH
在支持highp
片段语言精度的系统上定义为一个
#define GL_FRAGMENT_PRECISION_HIGH 1
并且未在不支持
highp
片段语言精度的系统上定义。定义后,此宏在顶点和片段语言中均可用。在highp
预选赛中的片段语言的可选功能,并且不被启用#extension
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句