【问题标题】:Names of `out` variables in a fragment shader片段着色器中“out”变量的名称
【发布时间】:2012-08-04 14:00:45
【问题描述】:

在阅读 OpenGL SuperBible 时,我在理解最基本(平面)着色器示例中的一行时遇到了一些问题。

在第 6 章的清单 6.4 和 6.5 中,它介绍了以下两个非常基本的着色器。

6.4 顶点着色器

// Flat Shader
// Vertex Shader
// Richard S. Wright Jr.
// OpenGL SuperBible
#version 130

// Transformation Matrix
uniform mat4    mvpMatrix;

// Incoming per vertex
in vec4 vVertex;

void main(void) 
    { 
    // This is pretty much it, transform the geometry
    gl_Position = mvpMatrix * vVertex;
    }

6.5 片段着色器

// Flat Shader
// Fragment Shader
// Richard S. Wright Jr.
// OpenGL SuperBible
#version 130

// Make geometry solid
uniform vec4 vColorValue;

// Output fragment color
out vec4 vFragColor;


void main(void)
   { 
   gl_FragColor = vColorValue;
   }

我的困惑是它在 out 声明中说 vFragColor 而在 main() 中说 gl_FragColor

另一方面,在网站的代码中,它已被更正为“vFragColor = vColorValue;”在主循环中。

我的问题是,除了书中的错字之外,命名 out 着色器值的规则是什么?他们必须遵循特定的名称吗?

在 OpenGL.org 上,我发现 gl_Position 是 out of the vertex shader 所必需的。 片段着色器有没有这样的东西?或者只是如果只有一个输出,那么它将是缓冲区中的颜色?

当片段着色器中有多个时会发生什么? GLSL 编译器如何知道在缓冲区中使用哪一个?

【问题讨论】:

标签: opengl glsl shader fragment-shader vertex-shader


【解决方案1】:

the GLSL specification for version 1.3 中所述,不推荐在片段着色器中使用gl_FragColor。相反,您应该使用用户定义的输出变量,例如 vFragColor 片段着色器中描述的变量。正如你所说,这是一个错字。

着色器值的命名规则是什么?

变量名称可以是任何你喜欢的名称,除非它与任何现有名称冲突。

当片段着色器中有多个时会发生什么? GLSL 编译器如何知道在缓冲区中使用哪一个?

当片段着色器中有多个输出时,您应该通过调用BindFragDataLocation 将插槽分配给片段着色器输出。然后,您可以通过调用 DrawBuffers 来说明哪些插槽将渲染到哪个渲染目标。

规范规定,如果您在片段着色器中定义了一个输出变量,它将被分配到索引 0 并输出 0。有关详细信息,我建议您自己take a look at it

【讨论】:

  • 感谢您的回答!您能否详细说明“当片段着色器中有多个时会发生什么?”部分?那部分的答案不是针对问题的。
  • 我添加了那部分。很难找到关于此事的良好文档。
  • 感谢您添加的详细信息!
【解决方案2】:

gl_FragColor 是早期版本的 GLSL 中的原始输出变量。这是要绘制的片段的颜色。

您最初的困惑是有道理的,因为没有理由声明 out 变量然后写入 glFragColor。

在后来的版本中,它变得可自定义,这样您就可以为输出变量指定任意名称。您可以使用命令glBindFragDataLocation 将这些任意输出映射到特定缓冲区。

我不是 100% 肯定的,但我相信如果您在链接之前不调用此函数,那么您的输出变量将被随机分配给缓冲区。如果您只有一个输出,则应始终将其分配给缓冲区 0。

【讨论】:

  • 未绑定输出会发生什么变化。一些实现将它们视为死代码,死代码消除了写入它们的计算。
  • -1:“我不是100%肯定,但我相信如果你在链接之前不调用这个函数,那么你的输出变量将被随机分配到缓冲区” GL规范非常清除。如果您定义了恰好一个输出变量,那么它将始终分配给输出0,索引0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2020-08-22
  • 2021-04-21
  • 1970-01-01
相关资源
最近更新 更多