我试图使用多次渲染系统在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着色器用于计算纹理坐标。
此技术基于可用的注释here。
到目前为止所采取的调试步骤:
I)从磁盘加载静态立方体贴图以测试着色器。它按预期工作。
II)在前6次传递期间使用glReadPixels查询帧缓冲区的内容。场景应该出现了。
III)渲染完成后,使用glGetTexImage复制立方体贴图的内容。将内容写入磁盘作为映像文件。立方体的各个方面都应该出现。
我只能得出帧缓冲区/纹理正确渲染的结论。无论出于何种原因,我无法将最终的纹理显示在最终网格上。在最终渲染过程之前,纹理肯定已绑定,并且启用了GL_TEXTURE_CUBE_MAP_ARB。
如上述过程中所述,纹理在帧缓冲区渲染之前未绑定,以避免读/写冲突。同样,出于同样的原因,纹理在每次传递后都会从帧缓冲区中分离出来。
起初我担心我重复使用GL_COLOR_ATTACHMENT0_EXT会触发问题。在调试过程的第三步中,这似乎不太可能。此外,我已经在互联网论坛上找到了那些没有问题的人们的参考资料。
这是在NVIDIA 9400M(Mac OS X)上进行的。 OpenGL Extension Viewer报告我具有执行此操作所需的所有扩展。
对于可能导致此问题的任何见解表示赞赏。
答案 0 :(得分:2)
管理不是在6分钟后产生我自己的答案。在我的辩护中,原因有点奇怪。
在程序的其他地方,我启用了GL_GENERATE_MIPMAP_SGIS,这是负责生成mipmap的扩展程序。调用glFramebufferTexture2DEXT时,我忽略了指定mipmap LOD。
似乎这两个组合在最后一次传递中禁用了纹理。在渲染立方体贴图时关闭GL_GENERATE_MIPMAP_SGIS可以解决问题。
干杯。