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

时间:2015-02-16 11:20:51

标签: 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;
}

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

void main(){
  gl_FragColor = u_FragColor;
}

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

之前我读过this,但它对我没有帮助。

2 个答案:

答案 0 :(得分:17)

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

在顶点着色器中,如果未显式设置浮点类型的默认精度,则默认为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的充分理由。 mediumpint的默认值,也可以是float

在规范的第10节("问题")中,解释变得相当清楚。本节包含在讨论规范时打开的各种问题,然后回答。通常有一些解释可以解释为什么选择答案。

特别是" 10.3精密限定符"对此进行处理。其中一个问题和答案(第85页)是:

  

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

     

RESOLUTION:顶点着色器的highp,片段着色器没有默认精度。

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