OpenGL:在着色器中定义变量

标签 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. 问题:为什么是gl_Position已经定义的变量?

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

2.问:FragColor是手动定义的,OpenGL怎么知道怎么解释?

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

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

关于OpenGL:在着色器中定义变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30982539/

相关文章:

opengl - 两个进程可以渲染到一个 OpenGL Canvas 吗?

opengl - openGL 和 GLSL 中的点渲染

android - 打开 GL ES 2.0 - glGetAttribLocation 返回 -1

unity-game-engine - 着色器中的 3D 纹理模拟(子像素相关)

c++ - 如何减少对大量纹理的绘图调用次数?

c++ - obj + mlt 3d 模型呈现错误的颜色

c# - C# 中的密集图形应用程序(使用 .NET/Mono)

c++ - 禁止 GLSL 中的递归?

opengl - glm中矩阵值的顺序不正确?

three.js - 将粒子推离glsl和三个js中的mouseposition