OpenGL:在着色器中定义变量
OpenGL: Defining variables in shaders
我的 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.问题:为什么gl_Position
是一个已经定义好的变量?
这是因为 OpenGL/the 渲染管道必须知道哪些数据应该用作光栅化和插值的基础。因为总是只有一个这样的变量,所以 OpenGL 有一个预定义的变量 glPosition
。还有一些其他预定义变量,它们也在渲染管道中用于特定目的。如需完整列表,have a look here.
2。问题:FragColor 是手动定义的,OpenGL 怎么知道如何解释它?
片段着色器可以有任意数量的输出变量,在使用帧缓冲区时尤其需要。基本上有两个选项如何告诉 OpenGL 哪个变量应该写入哪个渲染缓冲区:一个可以从应用程序端使用 glBindFragDataLocation method. The second option is to specify this location(s) directly in the shaders using Layout Qualifiers 设置这个位置。在这两种情况下,变量的位置定义了数据写入哪个渲染缓冲区。
当不使用自定义帧缓冲区时(如您的情况),默认后缓冲区将从位置 0 处的片段输出变量获取数据。由于您的着色器只有一个输出变量,因此很可能是这个将有位置 0。(虽然我认为不能保证,如果我错了请纠正我)。
我的 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.问题:为什么gl_Position
是一个已经定义好的变量?
这是因为 OpenGL/the 渲染管道必须知道哪些数据应该用作光栅化和插值的基础。因为总是只有一个这样的变量,所以 OpenGL 有一个预定义的变量 glPosition
。还有一些其他预定义变量,它们也在渲染管道中用于特定目的。如需完整列表,have a look here.
2。问题:FragColor 是手动定义的,OpenGL 怎么知道如何解释它?
片段着色器可以有任意数量的输出变量,在使用帧缓冲区时尤其需要。基本上有两个选项如何告诉 OpenGL 哪个变量应该写入哪个渲染缓冲区:一个可以从应用程序端使用 glBindFragDataLocation method. The second option is to specify this location(s) directly in the shaders using Layout Qualifiers 设置这个位置。在这两种情况下,变量的位置定义了数据写入哪个渲染缓冲区。
当不使用自定义帧缓冲区时(如您的情况),默认后缓冲区将从位置 0 处的片段输出变量获取数据。由于您的着色器只有一个输出变量,因此很可能是这个将有位置 0。(虽然我认为不能保证,如果我错了请纠正我)。