我正在使用OGRE,Bullet和Equalizer开发虚拟现实环境的应用程序。我的渲染功能如下所示:
root->_fireFrameStarted();
root->_fireFrameRenderingQueued();
root->_fireFrameEnded();
_window->update(false);
窗口不执行缓冲区交换,因为Equalizer会这样做。这个功能很好,我们甚至可以使用粒子系统和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处理它不是一种选择。
答案 0 :(得分:0)
解决了问题:我在Ogre :: Root创建窗口之前创建了着色器。我已经改变了订单,现在可以了。