我正在使用 OGRE、Bullet 和 Equalizer 为虚拟现实环境开发应用程序。我的渲染函数如下所示:
root->_fireFrameStarted();
root->_fireFrameRenderingQueued();
root->_fireFrameEnded();
_window->update(false);
窗口不进行缓冲区交换,因为均衡器会这样做。这个功能很好用,我们甚至可以使用粒子系统和 OGRE 提供的所有其他花哨的东西。
然而,由于我们实验室的投影区域是弯曲的,我们有一个 GLSL 模块(我们称之为 Warp),我们在所有应用程序中都使用它来扭曲渲染输出,使其适合我们的投影墙。我们通过创建一个纹理、将后台缓冲区的内容复制到它并在渲染覆盖整个窗口的扭曲纹理时应用我们的变形着色器来实现这一点。您可以在此处找到源代码:pastebin。com/ TjNJuHtC 我们在 eq::Window::frameDrawFinish() 中调用这个模块,它适用于纯 OpenGL 应用程序,但不适用于 OGRE。
这是没有模块及其着色器的输出:http: //s1.directupload.net/images/130620/amr5qh3x.png
如果我启用该模块,这是相当奇怪的输出: http ://s14.directupload.net/images/130620/74qiwgyd.png
如果我禁用对 glBindTexture 的两个调用,太阳粒子效果 (flare.png) 使用的纹理将渲染到屏幕上(我会向您展示,但我只能使用两个链接)。
我认为相关的每个 GL 状态变量在我们的其他应用程序中具有相同的值。我检查了 GL_READ_BUFFER、GL_DRAW_BUFFER、GL_RENDER_MODE、GL_CULL_FACE_MODE 和 GL_DOUBLEBUFFER。
这引发了一些问题:为什么我对 glTexCopySubImage2D() 的调用似乎根本没有效果?为什么即使我告诉它只让每个片段都变红,我的着色器也不做任何事情?
补充:将整个着色器放入材质脚本并让 OGRE 处理它不是一种选择。