【问题标题】:Rendering dynamic cube maps in OpenGL with frame buffer objects使用帧缓冲区对象在 OpenGL 中渲染动态立方体贴图
【发布时间】:2011-01-23 19:07:03
【问题描述】:

我正在尝试使用多通道渲染系统在 OpenGL 中动态生成立方体贴图。我使用的方法成功地将场景渲染到帧缓冲区对象(使用 glReadPixels 测试)。帧缓冲区附加到纹理,其目标是 GL_TEXTURE_CUBE_MAP_ARB。通过使用 glGetTexImage 查询绑定的纹理并将内容写入磁盘,我已经验证了帧缓冲区内容 do 最终出现在纹理中。

但是,当我绑定立方体贴图以将其渲染到对象上时,纹理在网格上不可见。

流程如下:

1) 从 GL_TEXTURE_CUBE_MAP_ARB 中解除所有纹理的绑定

2) 绑定帧缓冲对象。

3) 将纹理附加到帧缓冲区的目标 GL_COLOR_ATTACHMENT0_EXT。我从立方体的正 x 侧开始 (GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB)。其他人在随后的通道中跟随。

4) 将深度渲染缓冲区附加到帧缓冲区的目标 GL_DEPTH_ATTACHMENT_EXT。

5) 使用 glDrawBuffer 直接渲染到 GL_COLOR_ATTACHMENT0_EXT。

6) 沿适当的轴渲染场景。

7) 仍然绑定帧缓冲区,使用 glFramebufferTexture2DEXT 分离纹理。

8) 解绑帧缓冲区并使用 glDrawBuffer 将渲染重定向到 GL_BACK。

9) 对立方体贴图的所有边重复步骤 1-8。

10) 绑定最终的立方体贴图纹理并渲染最终场景。 GLSL 着色器用于计算纹理坐标。

此技术基于可用的注释here

到目前为止采取的调试步骤:

I) 从磁盘加载静态立方体贴图以测试着色器。它按预期工作。

II) 在前 6 次通过期间使用 glReadPixels 查询帧缓冲区的内容。场景照原样出现。

III) 渲染完成后使用 glGetTexImage 复制立方体贴图的内容。将内容作为图像文件写入磁盘。立方体的各个面都按原样显示。

我只能得出结论,帧缓冲区/纹理正在被正确渲染。无论出于何种原因,我都无法让最终的纹理出现在最终的网格上。纹理在最终渲染过程之前肯定是绑定的,并且启用了 GL_TEXTURE_CUBE_MAP_ARB。

如上述过程中所述,纹理在帧缓冲区渲染之前是未绑定的,以避免读/写冲突。类似地,出于同样的原因,在每次传递之后,纹理都会从帧缓冲区中分离出来。

起初我担心我重复使用 GL_COLOR_ATTACHMENT0_EXT 会引发问题。鉴于我的调试过程的第三步,现在这似乎不太可能。此外,我在互联网论坛上发现有人在做同样的事情而没有问题。

这是在 NVIDIA 9400M (Mac OS X) 上进行的。 OpenGL 扩展查看器报告说我拥有执行此操作所需的所有扩展。

感谢您了解可能导致此问题的原因。

【问题讨论】:

    标签: opengl dynamic map buffer cube


    【解决方案1】:

    设法在 6 分钟后给出我自己的答案。在我看来,原因有点奇怪。

    在程序的其他地方,我启用了 GL_GENERATE_MIPMAP_SGIS,这是负责生成 mipmap 的扩展。我在调用 glFramebufferTexture2DEXT 时忽略了指定 mipmap LOD。

    似乎这两件事结合在一起会在最后一遍中禁用纹理。在渲染立方体贴图时关闭 GL_GENERATE_MIPMAP_SGIS 可以解决问题。

    干杯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      相关资源
      最近更新 更多