核心opengl 3.3推荐的着色器管道基础设施

我正在编写一个游戏项目,我正在使用OpenGl 3.3核心上下文来执行我的渲染。 目前我有不同types的渲染器。 每个渲染器都有它自己的一对顶点和片段着色器,一个统一的和属性的位置结构。 一个包含glBuffers,vertex-array-object和numverts(int)的结构,包含渲染一个对象(网格)所需的所有数据。 最后但并非最不重要的一个构造函数来创建和初始化属性/统一的位置一种方法来加载网格到网格数据和渲染方法本身。

我对这个devise绝对不满意。 每次我想创建一个新的简单着色器时,我都必须编写所有这些代码,而且我还没有find一种方法来减小新着色器的开销。 我所能做的就是在属性/统一位置结构中根据variables名自动获取属性/统一位置,并根据顶点结构的布局自动设置属性指针。

另一件我不喜欢的事情是,当我想要实现固定functionstream水线的函数glClipPlane的function时,我需要分别添加到每个着色器的统一,我需要在每个着色器中设置这个统一我需要在每个片段着色器中实现碎片的丢弃

是否有一些常见的做法可以显着降低新着色器的代码开销? 有好的着色器管道,你可以推荐我看看吗? 是否有一些好的做法,一次向几个着色器添加function?

我从你的问题中了解到,你正试图尽量减less你为新的着色器编写的代码量。

我使用的一件事,即使不是没有它的问题,是有条件的着色器编译 ,使用预处理器指令。 我所做的是在编译着色器程序时通过条件指令,并相应地构建函数。 例如,你有镜面reflectionfunction,漫reflection,纹理采样等等。然后根据这个建立着色器。

void glShaderSource(GLuint shader, GLsizei count, const GLchar **string, const GLint *length); 

请注意, glShaderSource需要一个string数组(不知道如何去处理这个),但这是OpenGL标准; 它需要一个数组,所以你可以连接着色器string。 horde3D也使用类似的技术。

如果这不是完全令人满意的,你可以使用统一的常量进行调查,但据我所知GLSL不支持 ,所以如果制服没有被GLSL编译器优化,你真的不想在你的着色器中分支。 另一方面,Direct3D支持这一点。

至于管理制服和属性:

对于属性我绑定常量属性位置,并将其保存在字典中。 这是简单而有效的,易于使用。

另一方面,制服稍微复杂一些。 我写了一篇关于这个话题的文章 ,总结是; 我使用观察模式来更新制服,而对于实际的统一types,我使用某种静态多态来正确处理不同的统一types。 这只是一个建议,可能不是最好的解决scheme。