2

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

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

过程如下:

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 着色器用于计算纹理坐标。

此技术基于此处提供的注释。

迄今为止采取的调试步骤:

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

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

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

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

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

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

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

任何对可能导致这种情况的洞察力都值得赞赏。

4

1 回答 1

2

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

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

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

干杯。

于 2011-01-23T19:17:53.643 回答