6

正如它在锡上所说:有任何理由使用gl_FragColor而不是gl_FragData[0]?如果不是,那为什么还gl_FragColor存在?它仅仅是gl_FragData从不存在的时代的遗产吗?

(是的,我知道在最新的 GLSL 版本中两者都已弃用,但我仍然想编写可以在旧卡上运行的代码。)

4

1 回答 1

13

我将向您推荐 GLSL 1.1 的 OpenGL 规范,因为它在两者之间几乎没有区别,只是说它们是互斥的。

OpenGL 着色语言(1.1 版) - 7.2 片段着色器特殊变量 - 第 43 页

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

鉴于这种语言,gl_FragColor在不使用 MRT(多个渲染目标)的着色器中可能应该首选。对于输出到多个缓冲区的着色器,请使用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.

他们正在提前考虑,但还没有完全准备好所有的部分。这无论如何都是古老的历史。

于 2013-09-29T07:17:24.930 回答