gl_FragColor是否会执行gl_FragData不执行的操作?

时间:2013-09-29 06:24:55

标签: opengl glsl

正如它所说的那样:是否有任何理由使用gl_FragColor代替gl_FragData[0]?如果没有,那么为什么gl_FragColor甚至存在?从gl_FragData不存在的时间开始仅仅是遗产吗?

(是的,我知道在最新的GLSL版本中都弃用了它们,但我仍然希望编写可以在较旧的卡上运行的代码。)

1 个答案:

答案 0 :(得分:11)

我将向您推荐GLSL 1.1的OpenGL规范,因为除了说它们是互斥的之外,两者之间的区别很小。

The OpenGL Shading Language (version 1.1) - 7.2 Fragment Shader Special Variables - pp.43

  

如果着色器静态为gl_FragColor赋值,则它可能不会为gl_FragData的任何元素赋值。如果着色器静态地将值写入gl_FragData的任何元素,则它可能不会为gl_FragColor赋值。也就是说,着色器可以将值分配给gl_FragColor或gl_FragData,但不能同时分配两者。

鉴于这种语言,在不使用MRT(多个渲染目标)的着色器中,gl_FragColor应该是首选。对于输出到多个缓冲区的着色器,请使用gl_FragData [n]。但永远不要混淆,即使您可能逻辑上假设gl_FragColorgl_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.

他们正在考虑未来,但还没有完成所有的工作。无论如何,这是古老的历史。