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?