gpt4 book ai didi

c++ - 使用openGL的glBindFramebuffer好像没有效果

转载 作者:太空宇宙 更新时间:2023-11-04 12:12:05 27 4
gpt4 key购买 nike

我正在研究 openGL 中的 FBO(帧缓冲对象)。现在,我只是想将某些东西渲染到 FBO,然后使用与其关联的纹理将该图像渲染到屏幕上。今天和昨天我一直在研究这个问题几个小时。我已经尝试尽可能接近地复制两个不同的示例,但我仍然遇到同样的问题。我完全被卡住了。

似乎正在发生的事情是帧缓冲区对象实际上并没有被绑定(bind)。在代码中,我有两组 glClear() 和 glClearColor() 命令:第一组用于绘制到帧缓冲区,第二组用于绘制到屏幕。但是,当我注释掉第二组时,第一组显然影响了屏幕。如果 FBO 被绑定(bind),它不应该接收那些命令,不会直接影响到屏幕的实际输出吗?

首先,我使用 glewInit(),然后我创建了一个 FBO,然后是一个 Renderbuffer 对象和一个与之关联的纹理,并执行所有必要的步骤将它们放在一起:

glewInit();

int width=512,height=512;

glGenFramebuffers(1, &fbo);
glGenRenderbuffers(1, &rbo);
glGenTextures(1, &fboTex);

glBindFramebuffer(GL_FRAMEBUFFER, fbo);

glBindTexture(GL_TEXTURE_2D, fboTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_INT, NULL);

glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboTex, 0);

glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo);

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
assert(status==GL_FRAMEBUFFER_COMPLETE);

glBindTexture(GL_TEXTURE_2D,0);
glBindFramebuffer(GL_FRAMEBUFFER,fbo);

然后,我绘制到帧缓冲区对象。

glClearColor(0.5,0.5,0.5,1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glColor4f(1.0,0,0,1);
glBegin(GL_QUADS);
glVertex2f(100,100);
glVertex2f(200,100);
glVertex2f(200,250);
glVertex2f(100,200);
glEnd();

然后我解除绑定(bind)以下三个对象中的每一个:

glBindFramebuffer(GL_FRAMEBUFFER,0);
glBindRenderbuffer(GL_RENDERBUFFER,0);
glBindTexture(GL_TEXTURE_2D,0);

然后我尝试将纹理绘制到窗口:

glEnable(GL_TEXTURE_2D);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTextureEXT(GL_TEXTURE_2D, fboTex);
glBegin(GL_QUADS);
glTexCoord2f(0,0);glVertex3f(-.5,-.5,0);
glTexCoord2f(1,0);glVertex3f(.5,-.5,0);
glTexCoord2f(1,1);glVertex3f(.5,.5,0);
glTexCoord2f(0,1);glVertex3f(-.5,.5,0);
glEnd();
glDisable(GL_TEXTURE_2D);
glFlush();

这一定是一些非常简单的错误,或者当我重新输入所有这些两次时以某种方式逃避了根除的误解,或者是驱动程序问题?我的驱动程序应该能够运行 3.2 版的 openGL...

在这个令人沮丧的问题上的任何帮助都会很棒。

编辑:我发现我最终做错了什么。我没有意识到 glColor 命令会影响任何已完成的绘图,无论您当时是否绑定(bind)了帧缓冲区。在绘制到 FBO 之后,我需要将 glColor 变回 更改为 (1,1,1),以便稍后使用其所有颜色渲染 FBO 的纹理。

最佳答案

如果没有完整的代码示例,很难看出哪里出了问题。为了启动您的 FBO 工作,我提供 https://github.com/datenwolf/codesamples/tree/master/samples/OpenGL/minimalfbo

关于c++ - 使用openGL的glBindFramebuffer好像没有效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9349702/

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