OpenGL FrameBuffer对象怪异的行为

时间:2010-04-28 05:44:04

标签: opengl glut fbo

我的算法是:

将场景渲染到具有来自多个位置的阴影贴图的FBO 使用阴影贴图将场景渲染到屏幕 ...我仍然需要的黑魔法...... 将步骤1的样品与步骤2的图像合并

我正在尝试调试步骤1和2,并且遇到了STRANGE行为。我为每个阴影映射传递的算法是: 将场景渲染到FBO,该FBO连接到来自每个灯的POV的深度阵列纹理 从视点渲染场景并使用顶点/碎片着色器来比较深度

当我以这种方式运行算法时:

从点到渲染到FBO 从点到屏幕渲染 glutSwapBuffers()

屏幕传递中的法线向量似乎不正确(可能反转)。我很确定这是问题,因为我的漫反射光照计算不正确,但材质颜色正确,阴影出现在正确的位置。因此,似乎唯一可能是罪魁祸首的是法线。

但是,如果我这样做

从点到渲染到FBO 从点到屏幕渲染 glutSwapBuffers()//这里错了 从点到屏幕渲染 glutSwapBuffers()

第二遍是正确的。我假设我的帧缓冲调用有问题。任何人都可以从下面的日志中看到问题所在?它来自一个号角跟踪的“缓冲区”,只需进行一些编辑,使其更加清晰。

[INFO] trace.call: glGenFramebuffersEXT(1, 0xdfeb90 -> { 1 })
[INFO] trace.call: glGenFramebuffersEXT(1, 0xdfebac -> { 2 })
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1)
[INFO] trace.call: glDrawBuffer(GL_NONE)
[INFO] trace.call: glReadBuffer(GL_NONE)
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0)
//start render to FBO
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 2)
[INFO] trace.call: glReadBuffer(GL_NONE)
[INFO] trace.call: glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 2, 0)
[INFO] trace.call: glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 3, 0)
[INFO] trace.call: glDrawBuffer(GL_COLOR_ATTACHMENT0)
//bind to the FBO attached to a depth tex array for shadows
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1)
[INFO] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0)
[INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT)
//draw geometry
//bind to the FBO I want the shadow mapped image rendered to
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 2)
[INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
//draw geometry

//draw to screen pass
//again shadow mapping FBO
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1)
[INFO] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0)
[INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT)
//draw geometry
//bind to the screen
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0)
[INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
//finished, swap buffers
[INFO] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002)
//INCORRECT OUTPUT

//second try at render to screen:
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1)
[INFO] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0)
[INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT)
//draw geometry
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0)
[INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
draw geometry
[INFO] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002)
//correct output

1 个答案:

答案 0 :(得分:0)

您的FBO代码没有任何问题。但你并没有告诉我们一切。如果这真的是你在做什么:

[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0)
[INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
//finished, swap buffers
[INFO] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002)
//INCORRECT OUTPUT

然后不正确的输出将是黑屏(因为你绑定了默认的帧缓冲区,清除和交换缓冲区)。 glClear()和glXSwapBuffers()之间必须进行一些渲染。你应该发布完整的源代码而不是这个grep-ped trace。

其次,您的问题与FBO没有任何关系。它们不会以任何方式影响光照,你最有可能无法正确设置矩阵(当混合使用光线和相机外观时很容易弄乱)。你的答案有点乱,所以你的代码很可能也有些混乱。也许你应该试着去看那里......