如何在不使用材质脚本的情况下在OGRE应用程序中使用GLSL着色器?

如何在不使用材质脚本的情况下在OGRE应用程序中使用GLSL着色器?,glsl,shader,ogre,equalizer,Glsl,Shader,Ogre,Equalizer,我正在使用食人魔、子弹和均衡器为虚拟现实环境开发一个应用程序。我的渲染函数如下所示: root->_fireFrameStarted(); root->_fireFrameRenderingQueued(); root->_fireFrameEnded(); _window->update(false); 窗口不执行缓冲区交换,因为均衡器执行该操作。这个功能运行良好,我们甚至可以使用粒子系统和食人魔提供的所有其他奇特的东西 但是,由于我们

我正在使用食人魔、子弹和均衡器为虚拟现实环境开发一个应用程序。我的渲染函数如下所示:

    root->_fireFrameStarted();
    root->_fireFrameRenderingQueued();
    root->_fireFrameEnded();
    _window->update(false);
窗口不执行缓冲区交换,因为均衡器执行该操作。这个功能运行良好,我们甚至可以使用粒子系统和食人魔提供的所有其他奇特的东西

但是,由于我们实验室中的投影区域是弯曲的,因此我们在所有应用程序中都使用GLSL模块(我们称之为扭曲)来扭曲渲染输出,使其适合我们的投影墙。我们通过创建纹理,将后缓冲区的内容复制到它,并在渲染覆盖整个窗口的扭曲纹理时应用扭曲着色器来实现这一点。 您可以在这里找到源代码:pastebin。com/TjNJuHtC 我们在eq::Window::frameDrawFinish()中调用这个模块,它可以很好地用于纯OpenGL应用程序,但不能用于OGRE

这是不带模块及其着色器的输出:

如果我启用模块,这是一个相当奇怪的输出:

如果我禁用对glBindTexture的两个调用,太阳粒子效果(flare.png)使用的纹理将渲染到屏幕上(我将向您显示它,但我只能使用两个链接)

<> p>每个GL状态变量在其他应用中都具有相同的值。 我检查了GL_读取缓冲区、GL_绘制缓冲区、GL_渲染缓冲区模式、GL_消隐缓冲区模式和GL_双缓冲区

这引发了一些问题:为什么我对glTexCopySubImage2D()的调用似乎没有任何效果?为什么我的着色器不做任何事情,即使我告诉它只是让每个片段变成红色


补充:将整个着色器放入材质脚本并让食人魔处理它不是一个选项。

解决了问题:我在食人魔::Root创建我的窗口之前创建了我的着色器。我已经更改了顺序,现在可以使用了。

我替换了glCopyTexSubImage2D(GL_纹理_2D,0,0,0,0,0,_宽度,_高度);使用glCopyTexImage2D(GL_纹理_2D,0,GL_RGB,0,0,_宽度,_高度,0);现在我将缓冲区的内容放入纹理中!但是,我的非常简单的片段着色器(gl_FragColor=vec4(1.0,0.0,0.0,1.0;)仍然被忽略,纹理按原样渲染。。。