编辑:这是来自堆栈溢出的问题的重复:
https://stackoverflow.com/questions/9222217/how-does-the-fragment-shader-know-what-variable-to-use-for -the-color-of-a-pixel

如果要将值从顶点着色器发送到片段着色器,则顶点着色器应将一个变量声明为out,片段着色器应将其他变量声明为in和两个变量的名称和类型必须相同。但是,当您要从片段着色器发送颜色值时,不会发生这种情况。实际上,您可以根据需要调用输出变量。为什么?在旧版本中,有一个名为gl_FragColor的变量。
程序如何将输出片段变量与gl_FragColor链接?

评论

关于跨站点重复的元数据及其是否存在问题的讨论

如果您还有其他问题,请将其发布为新问题,而不是将其编辑为现有问题。这样,可以独立比较各个问题的答案。如果相关,您仍然可以在问题之间包含链接。

#1 楼

它的工作方式与顶点着色器输入几乎完全相同。

在顶点着色器中,您具有输入。这些输入表示顶点属性索引,即传递给glVertexAttribPointerglEnableVertexAttribArray的数字,依此类推。您可以设置从哪个属性提取哪个输入。在GLSL 3.30中,您使用以下语法:

layout(location = 2) in color;


这会将color顶点着色器输入设置为来自属性位置2。在3.30之前(或没有ARB_explicit_attrib_location的情况下)必须先使用glBindAttrbLocation进行显式设置,然后再进行链接,或者使用glGetAttribLocation在程序中查询属性索引。如果您未明确提供属性位置,则GLSL将任意分配位置(即,以实现定义的方式)。

在着色器中设置它几乎总是更好的选择。

无论如何,片段着色器输出的工作方式几乎完全相同。片段着色器可以写入多种输出颜色,它们本身会映射到帧缓冲区中的多个缓冲区。因此,您需要指示哪个输出转到哪种片段输出颜色。

此过程从片段输出位置值开始。它的设置与顶点着色器的输入位置非常相似:

layout(location = 1) out secColor;


还有API函数glBindFragDataLocationglGetFragDataLocation,它们类似于glBindAttribLocationglGetAttribLocation

如果您不执行任何显式分配,则实现通常会将您的输出变量之一分配给位置0。但是,OpenGL标准不需要此行为,因此您也不应该依赖它。