Spark AR —— SparkSL 总览【三】

288 阅读2分钟

这是我参与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;
 }