片段着色器如何知道像素的颜色使用什么variables?

我看到很多不同的片段着色器,

#version 130 out vec4 flatColor; void main(void) { flatColor = vec4(0.0,1.0,0.0,0.5); } 

他们都使用不同的variables“out color”(在这个例子中是flatColor )。 那么OpenGL如何知道你在做什么?

我猜这是有效的,因为flatColor是唯一定义为variables,但你可以添加更多的variables不是吗? 或者只是崩溃?


其实作为一个testing,我只是跑这个:

 #version 330 in vec2 TexCoord0; uniform sampler2D TexSampler; out vec4 x; out vec4 y; void main() { y = texture2D(TexSampler, TexCoord0.xy); } 

它运行良好,无论我使用xy


此外,我们有一个预定义的gl_FragColor 。 有什么区别,为什么人们通常坚持使用自己的variables?

此外,我们有一个预定义的gl_FragColor。

我们先从这个开始。 不,你没有预定义的gl_FragColor 。 这是从核心OpenGL 3.1和以上删除。 除非你使用兼容性(在这种情况下,你的3.30着色器应该在顶部说#version 330 compatibility ),否则你不应该使用它。

现在回到用户定义的片段着色器输出。 但首先,一个快速的比喻。

请记住,在顶点着色器中,如何input? 这些input代表顶点属性索引,你传递给glVertexAttribPointerglEnableVertexAttribArray等等的数字? 你设置哪个input从哪个属性拉。 在GLSL 3.30中,您使用以下语法:

 layout(location = 2) in color; 

这将color顶点着色器input设置为来自属性位置2.在3.30之前(或没有ARB_explicit_attrib_location),您必须在链接或查询属性索引的程序之前,使用glBindAttrbLocation明确地设置它为glGetAttribLocation 。 如果你没有明确提供一个属性位置,GLSL将任意地分配一个位置(即:以实现定义的方式)。

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

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

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

 layout(location = 1) out secColor; 

还有API函数glBindFragDataLocationglGetFragDataLocation ,类似于glBindAttribLocationglGetAttribLocation

如果你没有做任何明确的分配,实现通常会将你的输出variables中的一个分配给位置0.但是,OpenGL标准不需要这种行为,所以你也不应该依赖它。

现在公平地说,当你使用两个没有得到不同输出位置的输出时,你的程序应该没有链接。 可能发生的事情是,你的编译器优化了你没有写出来的编译器,所以当它到了检查链接器错误的时候就忘记了。

我想为使用GLSL_ES_3.10 链接的 OpenGLES 3.1指定它:

§4.4.2

如果[片段着色器]中只有一个输出,则不需要指定位置,在这种情况下,默认为零。