为什么有必要为片段着色器设置精度?

And*_*man 18 precision shader opengl-es webgl

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

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

void main(){
  gl_Position = a_Position;
  gl_PointSize = a_PointSize;
}
Run Code Online (Sandbox Code Playgroud)

// fragment.shader
precision mediump float;
uniform vec4 u_FragColor;

void main(){
  gl_FragColor = u_FragColor;
}
Run Code Online (Sandbox Code Playgroud)

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

我之前读过这篇文章,但它对我没有帮助.

And*_*man 18

在OpenGL ES 2.0中,片段着色器中的fp类型不存在默认精度.

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

OpenGL ES着色语言  - 4.变量和类型 - 第35-36页

片段语言没有浮点类型的默认精度限定符.因此,对于float,浮点向量和矩阵变量声明,声明必须包含精度限定符,或者必须先前已声明默认的float精度.

4.5.4可用的精度限定符

内置宏GL_FRAGMENT_PRECISION_HIGH被定义为支持highp片段语言精度的系统上的宏

#define GL_FRAGMENT_PRECISION_HIGH 1

并且没有在不支持highp片段语言精度的系统上定义.定义时,此宏在顶点和片段语言中都可用.在highp预选赛中的片段语言的可选功能,并且不被启用#extension.


Ret*_*adi 10

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

我一直认为没有违约是奇怪的.其他一切都有默认精度.默认情况不可能highp,因为不保证片段着色器可用.但我没有看到一个很好的理由,为什么它不能mediump默认.mediump是默认值int,它也可以是float.

该规范的第10节("问题")中的解释相当清楚.本节包含在讨论规范时打开的各种问题,然后回答.通常会有一些解释来推断选择答案的原因.

特别是,"10.3精度限定符"处理此问题.其中一个问题和答案(第85页)是:

应该有默认精度吗?将默认顶点精度指定为当前指定的高度是有意义的.关于片段方的默认精度应该是什么没有达成一致.

解决方案:顶点着色器为highp,片段着色器没有默认精度.

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