片段着色器如何知道像素的颜色使用什么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); }
它运行良好,无论我使用x
或y
。
此外,我们有一个预定义的gl_FragColor
。 有什么区别,为什么人们通常坚持使用自己的variables?
此外,我们有一个预定义的gl_FragColor。
我们先从这个开始。 不,你没有预定义的gl_FragColor
。 这是从核心OpenGL 3.1和以上删除。 除非你使用兼容性(在这种情况下,你的3.30着色器应该在顶部说#version 330 compatibility
),否则你不应该使用它。
现在回到用户定义的片段着色器输出。 但首先,一个快速的比喻。
请记住,在顶点着色器中,如何input? 这些input代表顶点属性索引,你传递给glVertexAttribPointer
和glEnableVertexAttribArray
等等的数字? 你设置哪个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函数glBindFragDataLocation
和glGetFragDataLocation
,类似于glBindAttribLocation
和glGetAttribLocation
。
如果你没有做任何明确的分配,实现通常会将你的输出variables中的一个分配给位置0.但是,OpenGL标准不需要这种行为,所以你也不应该依赖它。
现在公平地说,当你使用两个没有得到不同输出位置的输出时,你的程序应该没有链接。 可能发生的事情是,你的编译器优化了你没有写出来的编译器,所以当它到了检查链接器错误的时候就忘记了。
我想为使用GLSL_ES_3.10 链接的 OpenGLES 3.1指定它:
§4.4.2
如果[片段着色器]中只有一个输出,则不需要指定位置,在这种情况下,默认为零。