片段着色器中"out"变量的名称

hyp*_*not 2 opengl shader glsl vertex-shader fragment-shader

在阅读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;
    }
Run Code Online (Sandbox Code Playgroud)

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;
   }
Run Code Online (Sandbox Code Playgroud)

我的困惑是它在main()中vFragColor说出来时gl_FragColor在out声明中说.

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

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

在OpenGL.org上,我发现在顶点着色器之外需要gl_Position.片段着色器有没有这样的东西?或者只是如果只有一个输出,那么它将是缓冲区中的颜色?

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

Osk*_*kar 5

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

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

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

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

如果片段着色器中有多个输出,则应通过调用BindFragDataLocation为片段着色器输出分配插槽.然后,您可以通过调用DrawBuffers来说明哪些插槽将呈现给哪个渲染目标.

规范声明如果在定义的片段着色器中有一个输出变量,它将被分配到索引0和输出0.有关更多信息,我建议您自己查看.