【问题标题】:Dry coding with GLSL Opengl core使用 GLSL Opengl 核心进行干式编码
【发布时间】: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 中,您在顶点着色器中进行距离计算并将结果传递给图元组装。

标签: opengl glsl opengl-3


【解决方案1】:

OpenGL 核心没有移除用户裁剪平面。

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

至于“更改所有着色器”,这是一个潜在的解决方案:在 all VS 中调用“potentialSetClipDistance”,然后在 2 个不同的着色器对象中简单地实现该方法,根据具体情况链接到正确的着色器对象用法。这就是驱动程序在你背后在兼容 GL 中所做的事情。

【讨论】:

  • 哇,谢谢,这真的对我有帮助。但这并没有回答问题的重点。它仅在此示例中有所帮助。而且我仍然需要更改所有着色器程序,只是这次是顶点着色器,而不是片段着色器。
  • @Arne:嗯,是的,它没有回答这个问题,但这个问题是基于一个错误的前提。确实,着色器爆炸问题仍然存在。我用一个潜在的解决方案更新了我的答案。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多