我的着色器经常分享许多相同的功能。例如计算漫反射/镜面光照。我想写一遍,然后在不同的着色器中重用代码。如何编写可重用的glsl代码?
Glsl不知道文件,也不支持类似c的#include
预处理器指令。
我知道glsl支持从多个cstrings编译源代码,但是如何知道包含哪些cstrings?你是否实现了你自己的include版本?或者你为每个着色器创建一些图元文件?
我的着色器经常分享许多相同的功能。例如计算漫反射/镜面光照。我想写一遍,然后在不同的着色器中重用代码。如何编写可重用的glsl代码?
Glsl不知道文件,也不支持类似c的#include
预处理器指令。
我知道glsl支持从多个cstrings编译源代码,但是如何知道包含哪些cstrings?你是否实现了你自己的include版本?或者你为每个着色器创建一些图元文件?
在大型项目中,着色器通常在第一次运行时(或图形选项发生更改时)组装,因此它们将包含所有供应商特定的功能,并针对用户机器和设置进行了优化。而且不仅着色,还有渲染管线的一些阶段。
您可以将GLSL视为PHP脚本为响应请求而吐出的HTML \ CSS \ JavaSript代码。您可以使用与采样相同的工艺,在循环中进行代码注入(例如纹理查找量)。这对平面设计师来说也很好,因为他们通过参数化 - 支票簿,输入字段等简单控制着色器源,并且可以为独特的情况提供独特的着色器。
我有一个基于http://blackpixel.com/blog/494/xcode-using-includes-in-opengl-shaders/ [404现在]的自定义解决方案。基本上它说你可以使用m4工具预处理这些文件。
在GLSL源文件只包括要重复使用所需的片段:
include(Utils.glsl)
include(Colors.glsl)
...
void main (void) {
...
}
在Xcode中,添加所有glsl
文件“复制包资源”。
添加“运行脚本”阶段这个shell脚本:
#!/bin/sh
cd ${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}
find . -name "*.fsh" | while read file; do
echo Preprocess $file
m4 "$file" > "$file.tmp"
mv "$file.tmp" "$file"
done
exit 0
脚本假设你的着色器有.fsh
扩展。修改它以匹配着色器扩展是微不足道的。
被警告:几乎任何人都可以轻松访问着色器。您可以使用它进行开发,并在释放它们之前将它们转换为字符串(除非您加密它,否则不是真正的保护)。另外,如果着色器之间没有太多的共享,最终会出现大量未使用的代码。我猜着色器编译器会照顾它,但我不能100%确定是否存在性能损失。