使用GLSL Opengl核心进行干编码

时间:2014-02-22 21:30:15

标签: opengl glsl opengl-3

在我目前的项目中,我使用不同的材质进行渲染,这些材质都有自己的着色器,并且我在门户网站游戏中有门户网站。对于门户网站,我不得不做一些额外的剪辑。在OpenGl中,有一个名为glClipPlane的函数可以完美地完成这项工作。但不幸的是我有一个核心上下文,我在片段着色器中用“discard”实现了这个剪辑。但它要求我将代码复制并粘贴到我迄今为止编写的每个材料中。那么正确的方法是什么,不需要我复制粘贴我的代码到处?

正如所指出的,有一种更好的方法可以解决剪切问题,但这个问题只是一个例子,所以请不要试图找到一种替代的裁剪解决方案。

以下是伪代码示例:

//shader material1
void main() {
    if( dot( plane, gl_Position ) < 0 )
        discard;

    color = light * texture(...);
}

其他材料

//shader material2
void main() {
    if( dot( plane, gl_Position ) < 0 )
        discard;

    color = other fancy stuff;
}

关键是我在两个着色器中都有相同的代码,这会让我感到烦恼。

2 个答案:

答案 0 :(得分:4)

OpenGL核心没有删除用户剪辑平面。

您使用glEnable(GL_CLIP_DISTANCE_0)启用第一个,然后决定如何在顶点着色器中设置gl_ClipDistance[0]进行剪辑。

关于“更改所有着色器”,这是一个潜在的解决方案:在所有 VS中调用“potentialSetClipDistance”,并在2个不同的着色器对象中简单地实现该方法,根据用法。这就是驱动程序在compat GL背后所做的事情。

答案 1 :(得分:1)

我建议您使用与C代码相同的方法:编写函数或宏。将函数/宏放在一个单独的文件中并将其“包含”到基础着色器中(glShaderSource()可以使用任意数量的字符串;每个字符串可以是文件的源代码)。随着时间的推移,您最终会得到一个着色库,包含所有可重复使用的代码。