我的算法是这样的:
使用来自多个位置的阴影贴图将场景渲染到 FBO 使用阴影贴图将场景渲染到屏幕...我仍然必须实施的黑魔法... 将步骤 1 中的样本与步骤 2 中的图像结合起来
我正在尝试调试第 1 步和第 2 步,但遇到了奇怪的行为。我对每个阴影映射通道的算法是:将场景渲染到连接到深度阵列纹理的 FBO 从每个灯光的 POV 渲染场景并使用顶点/片段着色器来比较深度
当我以这种方式运行我的算法时:
从点渲染到 FBO 从点渲染到屏幕 glutSwapBuffers()
屏幕通道中的法线向量似乎不正确(可能反转)。我很确定这是问题所在,因为我的漫反射光照计算不正确,但材质颜色正确,并且阴影出现在正确的位置。因此,似乎唯一可能成为罪魁祸首的是法线。
但是,如果我这样做
从点渲染到 FBO 从点渲染到屏幕 glutSwapBuffers() //这里错误 从点渲染到屏幕 glutSwapBuffers()
第二遍是正确的。我认为我的帧缓冲区调用存在问题。谁能从下面的日志中看到问题所在?它来自一个为“缓冲区”而进行的号角跟踪,并进行了一些编辑以使其更加清晰。
[INFO] trace.call: glGenFramebuffersEXT(1, 0xdfeb90 -> { 1 }) [INFO] trace.call: glGenFramebuffersEXT(1, 0xdfebac -> { 2 }) [信息] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) [信息] trace.call:glDrawBuffer(GL_NONE) [信息] trace.call:glReadBuffer(GL_NONE) [INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) //开始渲染到FBO [信息] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 2) [信息] trace.call:glReadBuffer(GL_NONE) [信息] trace.call: glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 2, 0) [信息] trace.call: glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 3, 0) [信息] trace.call:glDrawBuffer(GL_COLOR_ATTACHMENT0) //绑定到附加到阴影深度tex数组的FBO [信息] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) [信息] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) [信息] trace.call:glClear(GL_DEPTH_BUFFER_BIT) //绘制几何图形 //绑定到我想要渲染阴影映射图像的 FBO [信息] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 2) [信息] trace.call:glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) //绘制几何图形 //绘制到屏幕通道 //再次阴影映射FBO [信息] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) [信息] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) [信息] trace.call:glClear(GL_DEPTH_BUFFER_BIT) //绘制几何图形 //绑定到屏幕 [INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) [信息] trace.call:glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) //完成,交换缓冲区 [信息] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002) //错误的输出 //第二次尝试渲染到屏幕: [信息] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) [信息] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) [信息] trace.call:glClear(GL_DEPTH_BUFFER_BIT) //绘制几何图形 [INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) [信息] trace.call:glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 绘制几何图形 [信息] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002) //正确输出