在我目前的项目中,我使用不同的材质进行渲染,这些材质都有自己的着色器,并且我在门户网站游戏中有门户网站。对于门户网站,我不得不做一些额外的剪辑。在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;
}
关键是我在两个着色器中都有相同的代码,这会让我感到烦恼。
答案 0 :(得分:4)
OpenGL核心没有删除用户剪辑平面。
您使用glEnable(GL_CLIP_DISTANCE_0)
启用第一个,然后决定如何在顶点着色器中设置gl_ClipDistance[0]
进行剪辑。
关于“更改所有着色器”,这是一个潜在的解决方案:在所有 VS中调用“potentialSetClipDistance”,并在2个不同的着色器对象中简单地实现该方法,根据用法。这就是驱动程序在compat GL背后所做的事情。
答案 1 :(得分:1)
我建议您使用与C代码相同的方法:编写函数或宏。将函数/宏放在一个单独的文件中并将其“包含”到基础着色器中(glShaderSource()可以使用任意数量的字符串;每个字符串可以是文件的源代码)。随着时间的推移,您最终会得到一个着色库,包含所有可重复使用的代码。