Opengl 渲染任何纹理

Opengl 渲染任何纹理,opengl,textures,fbo,Opengl,Textures,Fbo,我已经看到,您可以使用OpenGL的FBOs将内容渲染到纹理,也就是说,将新的Texture2D设置为GL\u COLORATTACHMENT0。但是,这难道不意味着我需要在着色器中使用out(location=0)显式渲染此颜色附件-这样我以任何其他方式渲染的任何内容都不会在该纹理中结束,对吗?因为我在opengl教程#14中看到过这样的内容: 如果这是真的,我如何渲染(例如,即时模式到纹理),如果这是可能的话?您在这里谈论的是四个不同的东西:渲染到纹理(RTT)、多个渲染目标(MRT)、固定

我已经看到,您可以使用OpenGL的FBOs将内容渲染到纹理,也就是说,将新的Texture2D设置为
GL\u COLORATTACHMENT0
。但是,这难道不意味着我需要在着色器中使用
out(location=0)
显式渲染此颜色附件-这样我以任何其他方式渲染的任何内容都不会在该纹理中结束,对吗?因为我在opengl教程#14中看到过这样的内容:


如果这是真的,我如何渲染(例如,即时模式到纹理),如果这是可能的话?

您在这里谈论的是四个不同的东西:渲染到纹理(RTT)、多个渲染目标(MRT)、固定功能管道(无着色器渲染)和即时模式几何体规范(glBegin/glEnd)

这些特性在OpenGL中都是相互独立的。OpenGL中的帧缓冲区通常可以由零个、一个或多个颜色缓冲区组成。这不仅适用于FBO,也适用于窗口系统提供的帧缓冲区(FBO 0):在典型情况下,一个具有两个颜色缓冲区
GL\u BACK
GL\u FRONT
。可能没有真正的用例来设置MRT以同时渲染到前缓冲区和后缓冲区,但这是可能的。但是,当您有一个支持Streoscope像素格式的实现时,您将有4个颜色缓冲区
GL\u FRONT\u LEFT
GL\u FRONT\u RIGHT
GL\u BACK\u LEFT
GL\u BACK\u RIGHT
(因此名为“四缓冲”),在某些情况下,通过MRT向左右渲染实际上是有用的

片段着色器的
布局(location=x)
输出限定符不映射到
GL\u COLOR\u ATTACHMENTx
。相反,还有另一个间接层次,由命令明确建立,它为每个颜色索引定义了实际的目标颜色缓冲区/附件。您的着色器可以写入任何(子)可用索引集

如果不使用着色器,颜色将写入颜色索引零,并且可以将其映射到您喜欢使用的任何附件。如果没有着色器,就无法使用MRT,因此只有一个颜色值,它最多只能写入FBO的一个颜色附件。(对于窗口系统提供的帧缓冲区,这并非完全正确,因为在立体上下文中有一些特殊值,如
GL_FRONT_和_BACK
GL_BACK
,这意味着
GL_BACK_LEFT
GL_BACK_RIGHT
,因此有时可以在没有MRT的情况下写入多个颜色缓冲区,但这会复制e将相同的值分配给不同的buffer)

最后,即时模式与这些都无关。如果使用
glBegin()/glEnd()
或使用顶点数组(客户端或VAOs)指定基本体,或使用无属性渲染并直接在着色器中生成它们,则完全不相关。重要的是在draw调用时设置了什么DrawBuffer


我希望您知道,即时模式以及固定功能管道在近十年来已经完全被弃用了。OpenGL的现代核心配置文件不再支持该功能。

这里讨论的是四种不同的功能:渲染到纹理(RTT)、多个渲染目标(MRT)、固定功能管道(无着色器渲染)和即时模式几何体规范(glBegin/glEnd)

这些特性在OpenGL中都是相互独立的。OpenGL中的帧缓冲区通常可以由零个、一个或多个颜色缓冲区组成。这不仅适用于FBO,也适用于窗口系统提供的帧缓冲区(FBO 0):在典型情况下,一个具有两个颜色缓冲区
GL\u BACK
GL\u FRONT
。可能没有真正的用例来设置MRT以同时渲染到前缓冲区和后缓冲区,但这是可能的。但是,当您有一个支持Streoscope像素格式的实现时,您将有4个颜色缓冲区
GL\u FRONT\u LEFT
GL\u FRONT\u RIGHT
GL\u BACK\u LEFT
GL\u BACK\u RIGHT
(因此名为“四缓冲”),在某些情况下,通过MRT向左右渲染实际上是有用的

片段着色器的
布局(location=x)
输出限定符不映射到
GL\u COLOR\u ATTACHMENTx
。相反,还有另一个间接层次,由命令明确建立,它为每个颜色索引定义了实际的目标颜色缓冲区/附件。您的着色器可以写入任何(子)可用索引集

如果不使用着色器,颜色将写入颜色索引零,并且可以将其映射到您喜欢使用的任何附件。如果没有着色器,就无法使用MRT,因此只有一个颜色值,它最多只能写入FBO的一个颜色附件。(对于窗口系统提供的帧缓冲区,这并非完全正确,因为在立体上下文中有一些特殊值,如
GL_FRONT_和_BACK
GL_BACK
,这意味着
GL_BACK_LEFT
GL_BACK_RIGHT
,因此有时可以在没有MRT的情况下写入多个颜色缓冲区,但这会复制e将相同的值分配给不同的buffer)

最后,即时模式与这些都无关。如果使用
glBegin()/glEnd()
或使用顶点数组(客户端或VAOs)指定基本体,或使用无属性渲染并直接在着色器中生成它们,则完全不相关。重要的是在draw调用时设置了什么DrawBuffer

我希望您知道,即时模式以及固定功能管道在近十年来已经完全被弃用了。OpenGL的现代核心配置文件不再支持该功能
layout(location = 0) out vec3 color;