我的算法是:
将场景渲染到具有来自多个位置的阴影贴图的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
答案 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没有任何关系。它们不会以任何方式影响光照,你最有可能无法正确设置矩阵(当混合使用光线和相机外观时很容易弄乱)。你的答案有点乱,所以你的代码很可能也有些混乱。也许你应该试着去看那里......