正如它所说的那样:是否有任何理由使用gl_FragColor
代替gl_FragData[0]
?如果没有,那么为什么gl_FragColor
甚至存在?从gl_FragData
不存在的时间开始仅仅是遗产吗?
(是的,我知道在最新的GLSL版本中都弃用了它们,但我仍然希望编写可以在较旧的卡上运行的代码。)
答案 0 :(得分:11)
我将向您推荐GLSL 1.1的OpenGL规范,因为除了说它们是互斥的之外,两者之间的区别很小。
如果着色器静态为gl_FragColor赋值,则它可能不会为gl_FragData的任何元素赋值。如果着色器静态地将值写入gl_FragData的任何元素,则它可能不会为gl_FragColor赋值。也就是说,着色器可以将值分配给gl_FragColor或gl_FragData,但不能同时分配两者。
鉴于这种语言,在不使用MRT(多个渲染目标)的着色器中,gl_FragColor
应该是首选。对于输出到多个缓冲区的着色器,请使用gl_FragData [n]
。但永远不要混淆,即使您可能逻辑上假设gl_FragColor
是gl_FragData [0]
的别名。
GLSL规范早于FBO,因此拥有一组输出片段数据的位置并不总是有意义的。由于GLSL和FBO都是OpenGL 3.0的核心,因此很容易将此视为理所当然。片段着色器的旧ARB扩展规范在这个主题上有一个模糊:
14)与可能的MRT(多重渲染目标)的交互是什么 扩展
The OpenGL Shading Language defines the array gl_FragData[] to output
values to multiple buffers. There are two situations to consider.
1) There is no MRT extension support. A shader can statically assign a
value to either gl_FragColor or gl_FragData[0] (but not both).
Either way the same buffer will be targeted.
2) There is MRT support. In this case what happens is defined in the
relevant MRT extension documentation.
他们正在考虑未来,但还没有完成所有的工作。无论如何,这是古老的历史。