OpenGL:在着色器中定义变量

时间:2015-06-22 14:28:26

标签: opengl glsl

我的OpenGL程序,使用GLSL作为着色器,有一个简单的顶点和片段着色器(由教程给出)。

顶点着色器是:

#version 330

layout (location = 0) in vec3 Position;

void main()
{
    gl_Position = vec4(0.5 * Position.x, 0.5 * Position.y, Position.z, 1.0);
}

片段着色器是:

#version 330

out vec4 FragColor;

void main()
{
    FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

这里发生的是顶点着色器将顶点坐标除以2,然后片段着色器将其以红色着色。

根据我的理解,gl_Position告诉片段着色器此向量的像素坐标。并且gl_Position是两个着色器都知道的现有变量,因此片段着色器在决定绘制该顶点的位置时将始终查找gl_Position

然而,FragColor呢?在此示例中,已在片段着色器中手动定义它。那么OpenGL如何知道FragColor是我们用来设置顶点颜色的变量?可以使用不同的名称定义FragColor,程序仍然以相同的方式运行。

所以我想知道为什么gl_Position是一个已经由OpenGL定义的变量,而FragColor是手动定义的,以及OpenGL如何解释如何解释FragColor

1 个答案:

答案 0 :(得分:2)

<强> 1。问题:为什么gl_Position是已定义的变量?

这是因为OpenGL /渲染管道必须知道哪些数据应该用作光栅化和插值的基础。由于总是只有一个这样的变量,因此OpenGL具有预定义的变量glPosition。还有一些其他预定义变量也在渲染管道中用于特定目的。有关完整列表,请have a look here

<强> 2。问题:FragColor是手动定义的,OpenGL如何解释它?

片段着色器可以具有任意数量的输出变量,尤其在使用framebuffers时需要。基本上有两种选择如何告诉OpenGL应该将哪个变量写入哪个渲染缓冲区:可以使用glBindFragDataLocation方法从应用程序端设置此位置。第二个选项是使用Layout Qualifiers直接在着色器中指定此位置。在这两种情况下,变量的位置都定义了写入数据的渲染缓冲区。

如果没有使用自定义帧缓冲区(如您的情况),默认后备缓冲区将从位置0处的片段输出变量获取数据。由于着色器只有一个输出变量,因此很可能这个变量有位置0.(虽然我认为不能保证,如果我错了,请纠正我。)