读GLSL 1.40规范:片段着色:输出变量
片段输出只能是浮动, 浮点矢量,符号或 无符号整数或整数矢量, 或任何这些阵列。矩阵和 结构不能输出。片段 输出被声明为 下面的例子:
出vec4 FragmentColor; out uint亮度;
将片段颜色定义为写入gl_FragColor ...是不是正确?有人可以清楚我对这些输出的想法吗?我可以只写一个例子的'FragmentColor'来确定片段颜色吗?我可以读回他们(例如'亮度')吗?
读GLSL 1.40规范:片段着色:输出变量
片段输出只能是浮动, 浮点矢量,符号或 无符号整数或整数矢量, 或任何这些阵列。矩阵和 结构不能输出。片段 输出被声明为 下面的例子:
出vec4 FragmentColor; out uint亮度;
将片段颜色定义为写入gl_FragColor ...是不是正确?有人可以清楚我对这些输出的想法吗?我可以只写一个例子的'FragmentColor'来确定片段颜色吗?我可以读回他们(例如'亮度')吗?
你举的例子有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;
}
全局输出变量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提供了相关信息。无论如何,也许你从我的文本中得到了一些东西。