Opengl es 为什么需要为片段着色器设置精度?

Opengl es 为什么需要为片段着色器设置精度?,opengl-es,webgl,shader,precision,Opengl Es,Webgl,Shader,Precision,我学习WebGL。下一个着色器工作正常: // vertex.shader // precision mediump float; attribute vec4 a_Position; attribute float a_PointSize; void main(){ gl_Position = a_Position; gl_PointSize = a_PointSize; } 及 为什么有必要为片段着色器设置精度?顶点着色器在没有此代码行的情况下工作,但片段着色器在没有此代码行的情

我学习WebGL。下一个着色器工作正常:

// vertex.shader
// precision mediump float;
attribute vec4 a_Position;
attribute float a_PointSize;

void main(){
  gl_Position = a_Position;
  gl_PointSize = a_PointSize;
}

为什么有必要为片段着色器设置精度?顶点着色器在没有此代码行的情况下工作,但片段着色器在没有此代码行的情况下不工作(如我所见)。为什么存在不同的行为

我以前读过,但对我没有帮助。

OpenGL ES 2.0中片段着色器中的fp类型不存在默认精度。 在顶点着色器中,如果未显式设置浮点类型的默认精度,则默认为
highp
。但是,如果片段着色器也默认为
highp
,这将导致问题,因为OpenGL ES 2.0不需要在片段着色器阶段支持高精度浮点类型

-4.变量和类型——第35-36页 片段语言没有浮点类型的默认精度限定符。所以对于浮动,浮动 点向量和矩阵变量声明,声明必须包含精度限定符或 默认浮点精度必须事先声明

4.5.4可用精度限定符 内置宏
GL\u FRAGMENT\u PRECISION\u HIGH
定义为在片段语言中支持
highp
精度的系统上的宏

#定义GL_片段_精度_高1

在片段语言中不支持
highp
精度的系统上未定义。定义后,该宏在顶点语言和片段语言中都可用。
highp
限定符是片段语言中的一个可选功能,不由
#extension
启用


简单的答案是,规范没有为片段着色器定义默认的浮点精度,因此您必须自己指定它

我一直认为没有违约有点奇怪。其他所有内容都具有默认精度。默认值不能是
highp
,因为这不能保证在片段着色器中可用。但是我没有看到一个很好的理由,为什么它不能默认为
mediump
mediump
int
的默认值,也可以是
float
的默认值

在规范的第10节(“问题”)中,解释变得相当清楚。本节包含了在讨论规范时未解决的各种问题,并随后得到了回答。人们通常会用推理来解释为什么会选择这个答案

特别是,“10.3精度限定符”处理这一问题。其中一个问题和答案(第85页)是:

是否应该有默认精度?将默认顶点精度指定为当前指定的顶点精度的上限是有意义的。对于片段端的默认精度应该是多少,没有达成一致意见

分辨率:顶点着色器为highp,片段着色器没有默认精度


我认为这其中的关键部分是:“没有协议”。听起来他们想定义一个默认精度,但不同的供应商无法就应该是什么达成一致,他们陷入僵局,最终根本没有定义一个。

因为GLSL ES standard这么说Big“GLSL(不是ES)没有此要求。@keltar感谢您提供的信息。我从来没有在我的GLSL着色器中使用过精度语句,我对这个问题感到困惑。对我来说,这只是一点知识。事实上,从我所看到的精度语句(如highp)可能会导致一个问题,这取决于GPU。我在没有精度设置的情况下遇到了问题,完全不知道错误来自哪里。。。单元查看此帖子
// fragment.shader
precision mediump float;
uniform vec4 u_FragColor;

void main(){
  gl_FragColor = u_FragColor;
}