这是我参与8月更文挑战的第19天,活动详情查看: 8月更文挑战
Spark AR 是 Facebook 免费创作 AR 作品的平台,使用户能够为 Facebook 和 Instagram 创建交互式增强现实体验,超过 40 万名创作者,190个国家/地区,使用 Spark AR 来创作自己的AR作品
由于该软件无需任何编码知识即可使用,因此任何人现在都可以在 AR 世界中几乎没有经验地制作下一个疯狂式传播的 Instagram AR 特效,引领世界潮流。
专门的 AR 滤镜设计师单价甚至可达到 1000 美元到 3 万美元不等。
可选的类型
SparkSL 中的任何类型都可以声明为可选的。可选类型的变量不要求它的值出现在着色器中。
相反,可选变量的值必须通过 valueOr() 函数访问,该函数接受一个参数,如果找不到该变量,则使用一个回退值。
这允许您编写单个函数来处理显式提供值的情况和缺少值的情况。
可选类型的一个常见用例是带有可选的普通、漫反射或镜面纹理的材质。
在下面的示例中,该函数会采样一个可选的法线贴图,如果纹理缺失,则返回片段法线。
// Samples a normal or returns the fragment normal
vec4 getNormal(optional<std::Texture2d> normalMap, vec2 uv) {
return normalMap(uv).valueOr(std::get FragmentNormal());
}
valurOr() 函数可以接受一个可选参数作为它的参数,这反过来又导致函数调用本身的结果是可选的。
vec4 main(optional<vec4> v0, optional<vec4> v1) {
return v0.valueOr(v1).valueOr(vec4(1.0));
}
还提供了二进制和一元操作符的重载。
float main(optional<float> f0, optional<float> f1) {
optional<float> res = f0 + f1;
return res.valueOr(0.0);
}
请注意,二进制操作符也用于可选操作数和非可选操作数的组合。在这些情况下,结果也是可选的。
函数注解
SparkSL 允许你用 @main 注解设置一个着色器代码片段的入口点
// @main
void main() {
// ...
}
@param 注解允许您为每个函数的参数指定默认值、最小值和最大值,并为每个参数的检查器条目提供名称和描述。
在下面的示例中,f 的范围边界是通过最小值和最大值来设置的,而默认值则是在代码片段上的端口未连接时指定 f 的值。
// @param[default=0.5, min=0.0, max=1.0] f
void main(float f) {
// ...
}
vec4 变量可以在其参数注解中使用十六进制颜色值,例如: @param[default=#AABB00FF] color。
此外,一个可选的 @return 注解可用于提供函数返回值的描述。
// This function description will appear in the inspector
// @param[default=0.5, min=0.0, max=1.0] p The description of p's port
// @param[default=vec2(0.0)] v The description of v's port
// @return The description of the return value
vec2 main(float p, vec2 v) {
return v * p;
}