【发布时间】:2014-02-22 21:30:14
【问题描述】:
在我当前的项目中,我使用不同的材质进行渲染,这些材质都有自己的着色器,并且我有类似于 Portal 游戏中的门户。对于传送门,我不得不做一些额外的剪辑。在 OpenGL 中有一个叫做 glClipPlane 的函数可以完美地完成这项工作。但不幸的是,我有一个核心上下文,我在片段着色器中用“丢弃”实现了这个剪辑。但它要求我将代码复制并粘贴到我迄今为止编写的所有材料中。那么什么是不需要我到处复制粘贴我的代码的正确方法呢?
正如所指出的,有更好的方法来解决剪裁问题,但是这个问题只是一个例子,所以请不要试图寻找剪裁的替代解决方案。
这是示例伪代码:
//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;
}
关键是我在两个着色器中都有相同的代码,这让我很烦。
【问题讨论】:
-
什么意思?可重用着色器?然后对相同类型的材质使用相同的着色器程序。
-
我做了一些修改。所以我希望现在更清楚了。
-
使用
gl_ClipDistance [...]。这将告诉原始组装阶段与任意一组剪切平面的距离。在 GL3 之前,您将输出单个剪辑位置,并且在图元组装期间将测试每个平面,但在现代 GL 中,您在顶点着色器中进行距离计算并将结果传递给图元组装。