【问题标题】:OpenGL FrameBuffer Objects weird behaviorOpenGL FrameBuffer Objects 奇怪的行为
【发布时间】:2011-02-13 04:48:10
【问题描述】:

我的算法是这样的:

使用来自多个位置的阴影映射将场景渲染到 FBO 使用阴影映射将场景渲染到屏幕上 ...我仍然必须实施的黑魔法... 将步骤 1 中的样本与步骤 2 中的图像组合

我正在尝试调试第 1 步和第 2 步,但遇到了奇怪的行为。我对每个阴影映射通道的算法是: 从每个灯光的 POV 将场景渲染到连接到深度阵列纹理的 FBO 从视点渲染场景并使用顶点/片段着色器来比较深度

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

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

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

如果我这样做了

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

第二遍是正确的。我认为我的帧缓冲区调用存在问题。谁能从下面的日志中看到问题所在?它来自一个为“缓冲区”grep 的号角跟踪,并进行了一些编辑以使其更加清晰。

[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)
//正确输出

【问题讨论】:

  • 您的帖子中的真正意思是“从点渲染到 FBO 渲染从点到屏幕 glutSwapBuffers()”吗?
  • 我的意思是渲染点到FBO,然后第一次渲染点到Screen。第二次我的意思是渲染点到 FBO,渲染点到屏幕(这里的交换缓冲区给我不正确的输出),然后再次渲染到屏幕(交换缓冲区在这里给我正确的输出)。很抱歉造成混乱,我想我的换行符没有像我预期的那样清晰。我的怀疑是有一些帧缓冲区参数在第一次通过时设置得太晚,第二次就可以了,但我不知道它是什么。

标签: opengl glut fbo


【解决方案1】:

您的 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 没有任何关系。它们不会以任何方式影响照明,您很可能没有正确设置矩阵(混合光源观察和相机观察时很容易搞砸)。您的答案有点混乱,因此您的代码也可能有点混乱。也许你应该尝试在那里寻找......

【讨论】:

    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多