ShaderGraphCoder

Build

您是否正在构建下一个伟大的 visionOS 应用?您是否也对使用方框和线条绘制着色器代码感到非常厌倦?ShaderGraphCoder 是一个嵌入式 DSL,用于以强类型 Swift 编写 RealityKit 着色器图 (兼容 USD)。

759 个着色器图节点通过 117 个运算符(数学、混合、纹理查找等)和 66 个源(常量、模型和视图变换等)提供。

支持平台: visionOS

示例

// Create a solid red material for visionOS
func solidRed() async throws -> ShaderGraphMaterial {
    let color: SGColor = .color3f([1, 0, 0])
    let surface = pbrSurface(baseColor: color)
    return try await ShaderGraphMaterial(surface: surface)
}

// Create a pulsing blue material for visionOS
func pulsingBlue() async throws -> ShaderGraphMaterial {
    let frequency = SGValue.floatParameter(name: "Frequency", defaultValue: 2)
    let color: SGColor = .color3f([0, 0, 1]) * sin(SGValue.time * frequency * (2*Float.pi))
    let surface = pbrSurface(baseColor: color)
    return try await ShaderGraphMaterial(surface: surface)
}

// Create a texture mapped material for visionOS
func textureMap(textureLocalURL: URL) async throws -> ShaderGraphMaterial {
    // Create the surface by sampling the texture map
    let surface =
        SGValue
        .texture(contentsOf: textureLocalURL)
        .sampleColor3f(texcoord: SGValue.uv0)
        .pbrSurface()
    return try await ShaderGraphMaterial(surface: surface)
}

使用 SwiftUI 的着色器预览

感谢 SwiftUI 与 RealityKit 的强大集成,您可以在 Xcode 画布中预览您的着色器。

着色器预览通过 ShaderGraphPreview 视图提供。您可以将其嵌入到您现有的 SwiftUI 视图中,或者仅使用 #Preview 宏来查看着色器的实际效果。

这是一个如何在您自己的视图中嵌入预览的示例

import SwiftUI
import ShaderGraphCoder

struct MyView: View {
    /// Create a blue surface shader
    let blueSurface = SGValue.color3f([0, 0, 1]).pbrSurface()
    var body: some View {
        // Preview the surface using ShaderGraphPreview
        ShaderGraphPreview(surface: blueSurface)
    }
}

或者您可以直接使用预览

#Preview {
    let blueSurface = SGValue.color3f([0, 0, 1]).pbrSurface()
    return ShaderGraphPreview(surface: blueSurface)
}

这将在 Xcode 画布中显示一个蓝色方框和一个蓝色球体

ShaderGraphPreview

支持所有 100 多个着色器操作,这是一个非常有趣的环境,可以随意尝试。

工作原理

当您使用提供的 SGValue 类型编写着色器代码时,对这些值的每个操作都会构建一个着色器图。该图以源值(参数、常量和世界信息)开始,每个操作通过添加节点和边来扩展该图。图中的每个节点都是一个操作,每条边都是一个值。当您从此图创建 ShaderGraphMaterial 时,该图将被编译成 USDA 材质,然后由 RealityKit 加载。

支持以下值类型

类型 描述
SGValue 基础值类型
SGNumeric: SGValue 数值类型标量、向量和颜色的基类
SGScalar: SGNumeric 单个数字
SGSIMD: SGNumeric SIMD 类型颜色和向量的基类
SGColor: SGSIMD 颜色值的向量,包含 3 个或 4 个元素
SGVector: SGSIMD 值的向量,包含 2 个、3 个或 4 个元素
SGMatrix: SGNumeric 具有 2 维、3 维或 4 维的方阵
SGTexture: SGValue 可以采样或读取的 2D 纹理
SGToken: SGValue 表面着色器或几何体修改器

这些 Swift 类型中的每一种都有一个可用的底层图数据类型,作为 dataType

更多详情请参阅 Values.swift

运算符

有超过 100 个运算符,以各种奇妙的方式组合 SGScalarSGVectorSGColorSGMatrix 值。从简单的算术到复杂的混合,应有尽有。

ifGreaterOrEqualifLess 运算符是条件运算符,它们接受一个条件、一个真值和一个假值。mix 运算符是一个线性插值运算符,它接受两个值和一个权重。由于 RealityKit 中不支持运行时条件,因此 ifGreaterOrEqualifLess 运算符是实现运行时逻辑的最佳方式。

支持以下运算符

运算符 描述
+ 加法
- 减法
* 乘法
/ 除法
% 取模
&& 逻辑与
|| 逻辑或
^^ 逻辑异或
abs(in1) 绝对值
acos(in1) 反余弦
add(in1, in2)
ambientOcclusion(coneangle, maxdistance) 环境光遮蔽
asin(in1) 反正弦
atan2(iny, inx) 反正切2
blur(in1, size, ...) 模糊
burn(fg, bg, ...) Burn
ceil(in1) 向上取整
cellNoise2D(texcoord) 蜂窝噪声 2D
cellNoise3D(position) 蜂窝噪声 3D
clamp(in1, min, ...) 钳制
contrast(in1, amount, ...) 对比度
cos(in1) 余弦
cross(in1, in2) 叉积
determinant(in1) 行列式
difference(fg, bg, ...) 差值
disjointover(fg, bg, ...) Disjoint Over
divide(in1, in2)
dodge(fg, bg, ...) Dodge
dot(in1, in2) 点积
exp(in1) 指数
extract(in1, index) 提取
floor(in1) 向下取整
fract(in1) 小数部分
fractal3D(amplitude, octaves, ...) 分形噪声 3D
geometryModifier(modelPositionOffset, color, ...) 几何体修改器
geometrySwitchCameraIndex(mono, left, ...) 相机索引切换
heightToNormal(in1, scale) 高度转法线
hsvAdjust(in1, amount) HSV 调整
hsvToRGB(in1) HSV 转 RGB
ifEqual(value1, value2, ...) 如果相等
ifGreater(value1, value2, ...) 如果大于
ifGreaterOrEqual(value1, value2, ...) 如果大于或等于
image(file, defaultValue, ...) 图像
inside(in1, mask) 内部
invertMatrix(in1) 矩阵求逆
length(in1) 模长
log(in1) 自然对数
logicalAnd(in1, in2)
logicalNot(in1)
logicalOr(in1, in2)
logicalXor(in1, in2) 异或
luminance(in1, lumacoeffs) 亮度
mask(fg, bg, ...) 蒙版
matte(fg, bg, ...) Matte
max(in1, in2) 最大值
min(in1, in2) 最小值
minus(fg, bg, ...) 减法混合
mix(fg, bg, ...) 混合
mixColor(fg, bg, ...) In
modulo(in1, in2) 取模
multiply(in1, in2)
noise2D(amplitude, pivot, ...) 噪声 2D
noise3D(amplitude, pivot, ...) 噪声 3D
normalMap(in1, space, ...) 法线贴图
normalMapDecode(in1) 法线贴图解码
normalize(in1) 归一化
oneMinus(in1) 一减
out(fg, bg, ...) Out
outside(in1, mask) 外部
over(fg, bg, ...) Over
overlay(fg, bg, ...) Overlay
pbrSurface(baseColor, emissiveColor, ...) PBR 表面
pixel(file, uWrapMode, ...) 图像 2D 像素
pixelGradient(file, uWrapMode, ...) 图像 2D 梯度像素
pixelLOD(file, uWrapMode, ...) 图像 2D LOD 像素
place2D(texcoord, pivot, ...) 放置 2D
plus(fg, bg, ...) 加法混合
pow(in1, in2)
premult(in1) 预乘
ramp4(valuetl, valuetr, ...) Ramp 4 角
ramplr(valuel, valuer, ...) Ramp 水平
ramptb(valuet, valueb, ...) Ramp 垂直
range(in1, inlow, ...) 范围
read(file, defaultValue, ...) 图像 2D 读取
reflect(in1, normal) 反射
refract(in1, normal, ...) 折射
remap(in1, inlow, ...) 重映射
rgbToHSV(in1) RGB 转 HSV
rotate2D(in1, amount) 旋转 2D
rotate3D(in1, amount, ...) 旋转 3D
round(in1) 四舍五入
safePow(in1, in2) 安全幂
sample(file, uWrapMode, ...) 图像 2D
sampleCube(file, uWrapMode, ...) 立方体图像
sampleCubeGradient(file, uWrapMode, ...) 立方体图像梯度
sampleCubeLOD(file, uWrapMode, ...) 立方体图像 LOD
sampleGradient(file, uWrapMode, ...) 图像 2D 梯度
sampleLOD(file, uWrapMode, ...) 图像 2D LOD
saturate(in1, amount, ...) 饱和
screen(fg, bg, ...) Screen
sign(in1) 符号
sin(in1) 正弦
smoothStep(in1, low, ...) 平滑步
splitlr(valuel, valuer, ...) 水平分割
splittb(valuet, valueb, ...) 垂直分割
sqrt(in1) 平方根
step(in1, edge) 阶跃
subtract(in1, in2)
switchValue(in1, in2, ...) 切换
tan(in1) 正切
tiledImage(file, defaultValue, ...) 平铺图像
transformMatrix(in1, mat) 变换矩阵
transformNormal(in1, fromspace, ...) 变换法线
transformPoint(in1, fromspace, ...) 变换点
transformVector(in1, fromspace, ...) 变换向量
transpose(in1) 转置
triplanarProjection(filex, filey, ...) 三平面投影
unlitSurface(color, opacity, ...) 无光照表面
unpremult(in1) 反预乘
worleyNoise2DFloat(texcoord, jitter) Worley 噪声 2D
worleyNoise2DVector2(texcoord, jitter) Worley 噪声 2D
worleyNoise2DVector3(texcoord, jitter) Worley 噪声 2D
worleyNoise3DFloat(position, jitter) Worley 噪声 3D
worleyNoise3DVector2(position, jitter) Worley 噪声 3D
worleyNoise3DVector3(position, jitter) Worley 噪声 3D

更多详情请参阅 Operations.swiftOperations.g.swift

支持以下源

描述
SGValue.color3f 具有可选颜色空间的常量 RGB 颜色
SGValue.color3fParameter 可以通过稍后更改材质来设置的 RGB 颜色参数
SGValue.color4f 具有可选颜色空间的常量 RGBA 颜色
SGValue.color4fParameter 可以通过稍后更改材质来设置的 RGBA 颜色参数
SGValue.surfaceCustomAttribute 从几何体修改器传递到表面着色器的值
SGValue.float 常量浮点数
SGValue.floatParameter 可以通过稍后更改材质来设置的参数
SGValue.modelNormal 正在处理的顶点或片段的模型法线
SGValue.modelPosition 正在处理的顶点或片段的模型位置
SGValue.objectNormal 正在处理的顶点或片段的对象法线
SGValue.objectPosition 正在处理的顶点或片段的对象位置
SGValue.textureParameter 可以通过稍后更改材质来设置的 2D 纹理参数
SGValue.uv(index) 顶点或像素的 UV 坐标
SGValue.uv0 顶点或像素的第一个 UV 坐标
SGValue.uv1 顶点或像素的第二个 UV 坐标
SGValue.vector2f 常量 2D 向量
SGValue.vector2fParameter 可以通过稍后更改材质来设置的 2D 向量参数
SGValue.vector3f 常量 3D 向量
SGValue.vector3fParameter 可以通过稍后更改材质来设置的 3D 向量参数
SGValue.vector4f 常量 4D 向量
SGValue.vector4fParameter 可以通过稍后更改材质来设置的 4D 向量参数
SGValue.worldCameraPosition 相机的世界位置
SGValue.worldNormal 正在处理的顶点或片段的世界法线
SGValue.worldPosition 正在处理的顶点或片段的世界位置
SGValue.bitangent(space, index) 副切线
SGValue.cameraPosition(space) 相机位置
SGValue.frame
SGValue.geomcolorColor3(index) 几何体颜色
SGValue.geomcolorColor4(index) 几何体颜色
SGValue.geomcolorFloat(index) 几何体颜色
SGValue.geometryModifierCustomAttribute 几何体修改器自定义属性
SGValue.geometryModifierCustomAttributeHalf20 几何体修改器自定义属性 0
SGValue.geometryModifierCustomAttributeHalf21 几何体修改器自定义属性 1
SGValue.geometryModifierCustomAttributeHalf40 几何体修改器自定义属性 0
SGValue.geometryModifierCustomAttributeHalf41 几何体修改器自定义属性 1
SGValue.geometryModifierCustomAttributeHalf42 几何体修改器自定义属性 2
SGValue.geometryModifierCustomAttributeHalf43 几何体修改器自定义属性 3
SGValue.geometryModifierCustomParameter 几何体修改器自定义参数
SGValue.geometryModifierModelPositionOffset 几何体修改器模型位置偏移
SGValue.geometryModifierModelToView 几何体修改器模型到视图
SGValue.geometryModifierModelToWorld 几何体修改器模型到世界
SGValue.geometryModifierNormalToWorld 几何体修改器法线到世界
SGValue.geometryModifierProjectionToView 几何体修改器投影到视图
SGValue.geometryModifierUV0Offset 几何体修改器 uv0 偏移
SGValue.geometryModifierUV0Transform 几何体修改器 uv0 变换
SGValue.geometryModifierUV1Offset 几何体修改器 uv1 偏移
SGValue.geometryModifierUV1Transform 几何体修改器 uv1 变换
SGValue.geometryModifierVertexId 几何体修改器顶点 ID
SGValue.geometryModifierViewToProjection 几何体修改器视图到投影
SGValue.geometryModifierWorldToModel 几何体修改器世界到模型
SGValue.materialParametersBaseColorTint 材质参数基础颜色色调
SGValue.materialParametersClearcoatRoughnessScale 材质参数粗糙度缩放
SGValue.materialParametersClearcoatScale 材质参数清漆层缩放
SGValue.materialParametersEmissiveColor 材质参数自发光颜色
SGValue.materialParametersMetallicScale 材质参数金属度缩放
SGValue.materialParametersOpacityScale 材质参数不透明度缩放
SGValue.materialParametersOpacityThreshold 材质参数不透明度阈值
SGValue.materialParametersRoughnessScale 材质参数粗糙度缩放
SGValue.materialParametersSpecularScale 材质参数镜面反射缩放
SGValue.normal(space) 法线
SGValue.position(space) 位置
SGValue.surfaceBaseColor 表面基础颜色
SGValue.surfaceClearcoat 表面清漆层
SGValue.surfaceClearcoatRoughness 表面清漆层粗糙度
SGValue.surfaceCustomAttribute 表面自定义属性
SGValue.surfaceCustomAttributeHalf20 表面自定义属性 0
SGValue.surfaceCustomAttributeHalf21 表面自定义属性 1
SGValue.surfaceCustomAttributeHalf40 表面自定义属性 0
SGValue.surfaceCustomAttributeHalf41 表面自定义属性 1
SGValue.surfaceCustomAttributeHalf42 表面自定义属性 2
SGValue.surfaceCustomAttributeHalf43 表面自定义属性 3
SGValue.surfaceCustomParameter 表面自定义参数
SGValue.surfaceEmissiveColor 表面自发光颜色
SGValue.surfaceMetallic 表面金属度
SGValue.surfaceModelToView 表面模型到视图
SGValue.surfaceModelToWorld 表面模型到世界
SGValue.surfaceOpacity 表面不透明度
SGValue.surfaceProjectionToView 表面投影到视图
SGValue.surfaceRoughness 表面粗糙度
SGValue.surfaceScreenPosition 表面屏幕位置
SGValue.surfaceSpecular 表面镜面反射
SGValue.surfaceViewDirection 表面视图方向
SGValue.surfaceViewToProjection 表面视图到投影
SGValue.surfaceWorldToView 表面世界到视图
SGValue.tangent(space, index) 切线
SGValue.texcoordVector2(index) 纹理坐标
SGValue.texcoordVector3(index) 纹理坐标
SGValue.time 时间
SGValue.upDirection(space) 上方向
SGValue.viewDirection(space) 视图方向

更多详情请参阅 Sources.swiftSources.g.swift

在命令行上构建

visionOS

xcodebuild -scheme ShaderGraphCoder -destination 'platform=visionOS Simulator,OS=1.0,name=Apple Vision Pro'