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 楼
它的工作方式与顶点着色器输入几乎完全相同。在顶点着色器中,您具有输入。这些输入表示顶点属性索引,即传递给
glVertexAttribPointer
和glEnableVertexAttribArray
的数字,依此类推。您可以设置从哪个属性提取哪个输入。在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函数
glBindFragDataLocation
和glGetFragDataLocation
,它们类似于glBindAttribLocation
和glGetAttribLocation
。如果您不执行任何显式分配,则实现通常会将您的输出变量之一分配给位置0。但是,OpenGL标准不需要此行为,因此您也不应该依赖它。
评论
关于跨站点重复的元数据及其是否存在问题的讨论如果您还有其他问题,请将其发布为新问题,而不是将其编辑为现有问题。这样,可以独立比较各个问题的答案。如果相关,您仍然可以在问题之间包含链接。