片段着色器:输出变量

11

阅读GLSL 1.40规范:

片段输出只能是浮点数、浮点向量、有符号或无符号整数或整数向量,或者它们的任何数组。矩阵和结构不能被输出。片段输出声明示例如下:

out vec4 FragmentColor; out uint Luminosity;

片段颜色是否定义为写入gl_FragColor...?这是正确的吗?有人能帮我澄清一下这些输出吗?我可以只写示例中的'FragmentColor'来确定片段颜色吗?我能够读取它们吗(例如'Luminosity')?

3个回答

17
全局输出变量 gl_FragColor 在 GLSL 版本 120 之后已经被弃用。 现在你必须自己给它命名和类型,就像你的示例一样。 关于多个输出,该链接提供了有关映射的信息:http://www.opengl.org/wiki/GLSL_Objects#Program_linking (我在这里找到了那个链接:http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=270999
希望这可以帮助你! :D
(哎呀!我看到 kvark 给出了相关的信息。无论如何,也许你从我的文字中得到了一些东西。)

4

您的示例有两个输出,它们在GLSL程序链接后与相应的FBO插槽相关联。您可以使用glBindFragDataLocation重定向它们。

一旦您激活了着色器并绑定了FBO,一切都取决于绘制掩码,由glDrawBuffers设置。例如,如果您在那里传递了GL_COLOR_ATTACHMENT0GL_COLOR_ATTACHMENT2,这意味着输出索引0将进入附件0,输出索引1将进入颜色附件2。


0

我想举几个例子:

void add(in float a, in float b, out float c)
{
    //you can not use c here. only set value
    //changing values of a and b does not change anything.
    c = a + b;
}

void getColor(out float r, out float g, out float b)
{
   //you can not use r, g, b here. only set value
   r = gl_FragColor.r;
   g = gl_FragColor.g;
   b = gl_FragColor.b;
}

void amplify(inout vec4 pixelColor, in value)
{
   //inout is like a reference
   pixelColor = pixelColor * value;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接