Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl gl_FragColor做了gl_FragData没有做的事情吗?_Opengl_Glsl - Fatal编程技术网

Opengl gl_FragColor做了gl_FragData没有做的事情吗?

Opengl gl_FragColor做了gl_FragData没有做的事情吗?,opengl,glsl,Opengl,Glsl,正如tin上所说:是否有任何理由使用gl\u FragColor而不是gl\u FragData[0]?如果没有,那么为什么gl\u FragColor甚至存在?这仅仅是gl_FragData不存在的时代遗留下来的吗 (是的,我知道在最新的GLSL版本中,两者都不推荐使用,但我仍然希望编写可以在旧卡上运行的代码。)我将向您介绍GLSL 1.1的OpenGL规范,因为它对两者几乎没有区别,只是说它们是互斥的 -7.2碎片着色器特殊变量-第43页 如果着色器静态地将值指定给gl_FragColor,

正如tin上所说:是否有任何理由使用
gl\u FragColor
而不是
gl\u FragData[0]
?如果没有,那么为什么
gl\u FragColor
甚至存在?这仅仅是
gl_FragData
不存在的时代遗留下来的吗


(是的,我知道在最新的GLSL版本中,两者都不推荐使用,但我仍然希望编写可以在旧卡上运行的代码。)

我将向您介绍GLSL 1.1的OpenGL规范,因为它对两者几乎没有区别,只是说它们是互斥的

-7.2碎片着色器特殊变量-第43页 如果着色器静态地将值指定给gl_FragColor,则它可能不会将值指定给gl_FragData的任何元素。如果着色器静态地将值写入gl_FragData的任何元素,则它可能不会将值指定给gl_FragColor。也就是说,着色器可以为gl_FragColor或gl_FragData指定值,但不能同时为两者指定值

鉴于这种语言,在不使用MRT(多个渲染目标)的着色器中,
gl_FragColor
可能是首选。对于输出到多个缓冲区的着色器,请使用
gl\u FragData[n]
。但千万不要混搭,即使从逻辑上来说,
gl\u FragColor
gl\u FragData[0]
的别名

GLSL规范早于FBO,因此有一个位置数组来输出片段数据并不总是有意义的。由于GLSL和FBO都是OpenGL3.0的核心,所以很容易认为这是理所当然的。片段着色器的旧ARB扩展规范有一个关于这个主题的简介:

14) 与可能的MRT(多渲染目标)的交互是什么 分机


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

谢谢你的广泛回答!但是,有一件事:“
gl\u FragColor
在不使用MRT的着色器中可能应该是首选的”--您认为在这种情况下应该严格首选
gl\u FragColor
有什么特别的原因吗?我问的一个主要原因是,如果我完全放弃
gl\u FragColor
,而只使用
gl\u FragData
,我可以更轻松地做一些事情。您发布的扩展规范片段的第1部分似乎表明,使用
gl\u FragColor
没有什么特别的优势。这是一个风格问题,就像使用0个参数的函数的参数列表中的(void)一样。如果你看到一个着色器使用了
gl\u FragColor
,你马上就会知道它是为一个渲染目标编写的,仅此而已。如果
gl_FragData[]
对你来说更有意义,那就去做吧,除了风格之外,没有任何有形的好处。啊,我明白了,我原则上同意。幸运的是,由于我正在开发一个代码生成系统,除了调试之外,人类很少能看到此着色器代码。:)FWIW,两者之间的区别在于
gl\u FragColor
是一种广播输出,它写入所有输出目标,而不仅仅是
gl\u FragData[0]
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.