阅读 GLSL 1.40 规范:
片段输出只能是浮点、浮点向量、有符号或无符号整数或整数向量,或任何这些的数组。不能输出矩阵和结构。片段输出在以下示例中声明:
出 vec4 FragmentColor; 输出单位亮度;
片段颜色定义为 gl_FragColor... 对吗?有人可以清除我对这些输出的想法吗?我可以只写示例的“FragmentColor”来确定片段颜色吗?我可以复读它们吗(例如“光度”)?
全局输出变量 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 给出了相关信息。无论如何,也许你也从我的文字中得到了一些东西。
您的示例有 2 个输出。在 GLSL 程序链接后,它们具有关联的相应 FBO 插槽。您可以使用重定向它们glBindFragDataLocation
。
激活着色器并绑定 FBO 后,这一切都取决于绘制蒙版,由glDrawBuffers
. 例如,如果你通过了GL_COLOR_ATTACHMENT0
那里GL_COLOR_ATTACHMENT2
,这意味着输出索引 0 将转到附件 0,输出索引 1 将转到颜色附件 2。
我想举一些例子:
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;
}