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