片段着色器:输出变量

时间:2009-11-14 09:52:56

标签: opengl shader glsl fragment

阅读GLSL 1.40规范:

  

片段输出只能是浮点数,   浮点向量,有符号或   无符号整数或整数向量,   或任何这些的数组。矩阵和   结构无法输出。分段   输出声明为   以下示例:

     

out vec4 FragmentColor;   out uint Luminosity;

片段颜色定义为写gl_FragColor ...是不是?有人可以清楚我对这些产出的看法吗?我可以只编写示例中的'FragmentColor'来确定片段颜色吗?我可以回读一下(比如'Luminosity')吗?

3 个答案:

答案 0 :(得分:16)

GLSL版本120之后不推荐使用全局输出变量gl_FragColor。 现在你必须自己给它一个名字和类型,如你的例子。 关于若干产出, 此链接为您提供有关映射的信息:http://www.opengl.org/wiki/GLSL_Objects#Program_linking

(我发现该链接位于:http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=270999

希望这有帮助! :D

哎呀!我看到kvark提供了相关信息。无论如何,也许你从我的文本中得到了一些东西。

答案 1 :(得分:4)

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

激活着色器并绑定FBO后,一切都取决于由glDrawBuffers设置的绘制蒙版。例如,如果您在那里传递GL_COLOR_ATTACHMENT0GL_COLOR_ATTACHMENT2,则意味着输出索引0将转到附件0,输出索引1将转到颜色附件2。

答案 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;
}