OpenGL FrameBuffer对象怪异的行为

我的算法是这样的:

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

我试图调试步骤1和2,并且遇到了STRANGE行为。 我为每个阴影贴图通过的算法是:将场景渲染到连接到每个光线的POV的深度阵列纹理的FBO,从视点渲染场景并使用顶点/碎片着色器来比较深度

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

从点到点渲染从点到点渲染glutSwapBuffers()

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

但是,如果我这样做

从指向FBO渲染从点到屏幕glutSwapBuffers()//在这里错误渲染从指向屏幕glutSwapBuffers()

第二遍是正确的。 我认为我的framebuffer调用有问题。 任何人都可以从下面的日志中看到问题是什么? 它来自一个为缓冲而津津乐道的军号踪迹,只需稍作修改即可使其更加清晰。

[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

你的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踪迹。

其次,你的问题与FBO没有任何关系。 它们不会以任何方式影响照明,你很可能不会正确地设置矩阵(当从光照和摄像机混合观看时很容易混淆)。 你的答案有点乱,所以你的代码很可能也有点混乱。 也许你应该尝试在那里寻找......

链接地址: http://www.djcxy.com/p/34049.html

上一篇: OpenGL FrameBuffer Objects weird behavior

下一篇: Why doesn't glCopyTexSubImage2D copy my square correctly?