gpt4 book ai didi

opengl - 设置 OpenGL 多个渲染目标

转载 作者:行者123 更新时间:2023-12-03 11:29:31 27 4
gpt4 key购买 nike

我已经看过很多关于这个主题的 Material ,但是我发现的示例之间存在一些差异,我很难对正确的过程有一个扎实的理解。希望有人能告诉我我是否走在正确的轨道上。我还应该提到我在 OS X Snow Leopard 和最新版本的 Xcode 3 上执行此操作。

举例来说,假设我要写入两个目标,一个用于正常,一个用于颜色。为此,我创建了一个帧缓冲区并将两个纹理绑定(bind)到它,以及一个深度纹理:

glGenFramebuffersEXT(1, &mFBO);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);

glGenTextures(1, &mTexColor);
glBindTexture(GL_TEXTURE_2D, mTexColor);
//<texture params>
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mTexColor, 0);

glGenTextures(1, &mTexNormal);
glBindTexture(GL_TEXTURE_2D, mTexNormal);
//<Texture params>
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mTexNormal, 0);

glGenTextures(1, &mTexDepth);
glBindTexture(GL_TEXTURE_2D, mTexDepth);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, w, h, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, mTexDepth, 0);

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)

在渲染之前,我会再次绑定(bind)帧缓冲区,然后执行:
GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
glDrawBuffers(2, buffers);

这意味着进一步的绘制调用将绘制到我的帧缓冲区。 (我认为?)

然后我会设置我的着色器并绘制场景。在我的顶点着色器中,我会像往常一样处理法线/位置/颜色,并将数据传递给片段着色器。然后片段将执行以下操作:
gl_FragData[0] = OutputColor;
gl_FragData[1] = OutputNormal;

此时,我应该有两个纹理;一种具有所有渲染对象的颜色,另一种具有法线。这一切都正确吗?我现在应该能够像使用其他任何纹理一样使用这些纹理,比如将它们渲染为全屏四边形,对吧?

最佳答案

听起来和看起来很合理。这确实是常见的方法。如果您不需要将深度数据作为纹理进行进一步处理,您也可以将渲染缓冲区用于附件,但纹理也应该可以正常工作。

您也可以使用glCheckFramebufferStatusEXT完成所有设置后,查看帧缓冲区在其当前配置中是否有效,但您的代码看起来不错。如果您没有问题并且这只是为了保证,请放心,您在正确的轨道上,否则请告诉我们出了什么问题。

关于opengl - 设置 OpenGL 多个渲染目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7207422/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com