渲染任何纹理

时间:2016-04-19 16:16:58

标签: opengl textures fbo

我已经看到您可以使用OpenGL的FBO将内容渲染到纹理中 - 也就是说,将新的Texture2D设置为GL_COLORATTACHMENT0。但是,这并不意味着我需要在着色器中使用out (location=0)显式渲染到此颜色附件 - 所以我以任何其他方式呈现的任何内容都不会在此纹理中结束,对?因为我在opengl-tutorials教程#14上看到了这样的话:

layout(location = 0) out vec3 color;

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

1 个答案:

答案 0 :(得分:2)

你在谈论四个不同的东西:渲染到纹理(RTT),多个渲染目标(MRTs),固定功能管道(渲染没有着色器)和立即模式几何规范(glBegin / glEnd)。

这些功能在OpenGL中都是相互独立的。 OpenGL中的帧缓冲区通常可以包含零个,一个或多个颜色缓冲区。这不仅适用于FBO,也适用于窗口系统提供的帧缓冲(FBO 0):在典型情况下,该缓冲区具有2个颜色缓冲区GL_BACKGL_FRONT。可能没有真正的用例来设置MRT以同时渲染到前端和后端缓冲区,但它仍然是可能的。但是,当您拥有支持 streoscopic 像素格式的实现时,您将拥有4个颜色缓冲区GL_FRONT_LEFTGL_FRONT_RIGHTGL_BACK_LEFTGL_BACK_RIGHT (因此名称"四重缓冲"),并且通过MRT向左和向右渲染在某些情况下实际上是有用的。

片段着色器的layout (location=x)输出限定符映射到GL_COLOR_ATTACHMENTx。相反,glDrawBuffers()命令明确地建立了另一个间接级别,它定义了每个颜色索引的实际目标颜色缓冲/附加。并且您的着色器可以写入任何(子)可用索引集。

如果您不使用着色器,则颜色将写入颜色索引零,您可以使用glDrawBuffer()将颜色映射到您喜欢的任何附件。如果没有着色器,您就无法使用MRT,因此只有一个颜色值,只能写入FBO的一个颜色附件。 (对于窗口系统提供的帧缓冲,这不完全正确,因为有GL_FRONT_AND_BACKGL_BACK等特殊值,这意味着GL_BACK_LEFT {{1}在立体上下文中,所以你有时可以在没有MRT的情况下写入多个颜色缓冲区,但是会将相同的值复制到不同的缓冲区。)

最后,立即模式与其中任何一个都无关。如果使用GL_BACK_RIGHT或使用Vertex Arrays(客户端或VAO)指定基元,或使用无属性渲染并以某种方式直接在着色器中生成它们,则完全无关紧要。重要的是你在绘制调用时设置的DrawBuffer。

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