gpt4 book ai didi

opengl - 片段着色器如何知道使用哪个变量来表示像素的颜色?

转载 作者:行者123 更新时间:2023-12-03 05:18:18 31 4
gpt4 key购买 nike

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

#version 130

out vec4 flatColor;

void main(void)
{
flatColor = vec4(0.0,1.0,0.0,0.5);
}

它们都使用不同的变量来表示“输出颜色”(在本例中为 flatColor)。那么 OpenGL 如何知道你想要做什么呢?

我猜这是可行的,因为 flatColor 是唯一定义为 out 的变量,但您可以添加更多 out 变量你不是吗?或者这会崩溃吗?

<小时/>

实际上,作为测试,我刚刚运行了这个:

#version 330

in vec2 TexCoord0;

uniform sampler2D TexSampler;

out vec4 x;
out vec4 y;

void main()
{
y = texture2D(TexSampler, TexCoord0.xy);
}

无论我使用x还是y,它都工作得很好。

(答案:编译器正在优化未使用的 var,因此剩余的 var 被分配到位置 0)

<小时/>

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

最佳答案

Furthermore, we have a predefined gl_FragColor.

我们就从这个开始吧。不,您没有预定义的gl_FragColor。它已从核心 OpenGL 3.1 及更高版本中删除。除非您使用兼容性(在这种情况下,您的 3.30 着色器应该在顶部显示#version 330兼容性),否则您永远不应该使用它。

现在,回到用户定义的片段着色器输出。但首先,做一个简单的类比。

还记得在顶点着色器中如何拥有输入吗?这些输入表示顶点属性索引、传递给glVertexAttribPointer 和glEnableVertexAttribArray 的数字等等?您可以设置从哪个属性提取哪个输入。在 GLSL 3.30 中,您使用以下语法:

layout(location = 2) in color;

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

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

无论如何,片段着色器输出的工作方式几乎完全相同。片段着色器可以写入 multiple output colors ,它们本身被映射到 multiple buffers in the framebuffer 。因此,您需要指示哪个输出转到哪个片段输出颜色。

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

layout(location = 1) out secColor;

还有API函数glBindFragDataLocationglGetFragDataLocation ,类似于 glBindAttribLocationglGetAttribLocation

如果您不进行任何显式分配,实现通常会将输出变量之一分配给位置 0。但是,OpenGL 标准不要求这种行为,因此您不应依赖也可以。

现在公平地说,当您使用两个没有不同输出位置的输出时,您的程序应该无法链接。可能发生的情况是,您的编译器优化了您没有写入的内容,因此当检查链接器错误时,它有点忘记了这一点。

关于opengl - 片段着色器如何知道使用哪个变量来表示像素的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9222217/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com