11

阅读 GLSL 1.40 规范:

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

出 vec4 FragmentColor; 输出单位亮度;

片段颜色定义为 gl_FragColor... 对吗?有人可以清除我对这些输出的想法吗?我可以只写示例的“FragmentColor”来确定片段颜色吗?我可以复读它们吗(例如“光度”)?

4

3 回答 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 给出了相关信息。无论如何,也许你也从我的文字中得到了一些东西。

于 2011-07-25T23:23:15.470 回答
4

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

激活着色器并绑定 FBO 后,这一切都取决于绘制蒙版,由glDrawBuffers. 例如,如果你通过了GL_COLOR_ATTACHMENT0那里GL_COLOR_ATTACHMENT2,这意味着输出索引 0 将转到附件 0,输出索引 1 将转到颜色附件 2。

于 2011-02-25T12:26:35.910 回答
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;
}
于 2009-11-16T14:07:44.723 回答