【发布时间】:2012-11-11 21:09:12
【问题描述】:
我的着色器经常共享许多相同的功能。例如漫反射/镜面光照的计算。我想写一次,然后在不同的着色器中重用代码。
Glsl 不了解文件,也不支持类似 c 的 #include 预处理器指令。
我知道 glsl 支持从多个 cstrings 编译源代码,但是你怎么知道要包含哪些 cstrings?您是否实现了自己的包含版本?还是为每个着色器创建某种元文件?
【问题讨论】:
-
对我来说 GLSL 有点太低级了,以至于实际上不可能将它用于复杂的情况(例如:PBR albedo 通道可能是程序、2D 纹理、没有代码生成器的平面颜色或其他东西),但替代解决方案通常过于高级和侵入性,也不能完全符合我的目的。我最终用一个简单的预处理器编写了自己的 GLSL 小扩展。我曾经使用 Lua 作为“元语言”,但在我花时间编写自己的小简单解析器之前,它从未如此精简。
-
如果你像我一样,有点控制狂,IMO 就是这样。您可以为自己预处理的 GLSL 语言添加一些扩展。我添加的第一个扩展是
channel关键字。它们允许我们做类似channel4 albedo;这样的事情,这意味着它应该出现在用户界面中,此时艺术家可以选择是否用单个纹理、复合纹理堆栈、程序、平面颜色来表示反照率,等等。然后根据艺术家的选择动态生成 GLSL 代码。 -
关于代码生成的最棘手的事情之一是,至少以我的方式,扩展需要能够生成代码,不仅在
main之外,而且在它内部.例如,如果反照率是由一堆纹理定义的,它们可能都有自己的 UV 纹理坐标,需要在垂直着色器中插值并在片段着色器中访问。因此,代码生成必须不仅能够在main之外生成/添加代码,而且还必须能够在内部生成/添加代码。不过,这对我来说是唯一真正棘手的部分。
标签: include preprocessor glsl code-reuse