阅读GLSL 1.40规范:
片段输出只能是浮点数, 浮点向量,有符号或 无符号整数或整数向量, 或任何这些的数组。矩阵和 结构无法输出。分段 输出声明为 以下示例:
out vec4 FragmentColor; out uint Luminosity;
片段颜色定义为写gl_FragColor ...是不是?有人可以清楚我对这些产出的看法吗?我可以只编写示例中的'FragmentColor'来确定片段颜色吗?我可以回读一下(比如'Luminosity')吗?
答案 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_ATTACHMENT0
和GL_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;
}