【问题标题】:Why it is necessary to set precision for the fragment shader?为什么需要为片段着色器设置精度?
【发布时间】:2015-02-16 11:20:50
【问题描述】:

我学习 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,但对我没有帮助。

【问题讨论】:

  • 因为 GLSL ES 标准是这么说的。 'Big' GLSL(不是 ES)没有这个要求。
  • @keltar 感谢您提供的信息。我从来没有在我的 GLSL 着色器中使用过精度语句,并且对这个问题感到困惑。对我来说只是另一种知识。实际上,根据我所见,精度语句(如 highp)可能会根据 GPU 导致问题。
  • 我在没有精度设置的情况下遇到了问题,完全不知道错误来自哪里......单元查看这篇文章

标签: opengl-es webgl shader precision


【解决方案1】:

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

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

OpenGL ES Shading Language - 4. 变量和类型 - 第 35-36 页

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

4.5.4 可用的精度限定符

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

#define GL_FRAGMENT_PRECISION_HIGH 1

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

【讨论】:

    【解决方案2】:

    简单的回答是规范没有为片段着色器定义默认的浮点精度,所以你必须自己指定。

    我一直认为没有默认设置有点奇怪。其他所有内容都有默认精度。默认值不能是highp,因为不能保证在片段着色器中可用。但我看不出默认情况下它不能是mediump 的充分理由。 mediumpint 的默认值,也可以是 float 的默认值。

    规范的第 10 节(“问题”)中的解释变得相当清楚。本节包含在讨论规范时未解决的各种问题,然后得到了回答。选择答案的原因通常有一些解释。

    “10.3 Precision Qualifiers”特别处理了这个问题。其中一个问题和答案(第 85 页)是:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多