您是否正在构建下一个伟大的 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 与 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 画布中显示一个蓝色方框和一个蓝色球体
支持所有 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 个运算符,以各种奇妙的方式组合 SGScalar
、SGVector
、SGColor
和 SGMatrix
值。从简单的算术到复杂的混合,应有尽有。
ifGreaterOrEqual
和 ifLess
运算符是条件运算符,它们接受一个条件、一个真值和一个假值。mix
运算符是一个线性插值运算符,它接受两个值和一个权重。由于 RealityKit 中不支持运行时条件,因此 ifGreaterOrEqual
和 ifLess
运算符是实现运行时逻辑的最佳方式。
支持以下运算符
运算符 | 描述 |
---|---|
+ |
加法 |
- |
减法 |
* |
乘法 |
/ |
除法 |
% |
取模 |
&& |
逻辑与 |
|| |
逻辑或 |
^^ |
逻辑异或 |
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.swift 和 Operations.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.swift 和 Sources.g.swift。
xcodebuild -scheme ShaderGraphCoder -destination 'platform=visionOS Simulator,OS=1.0,name=Apple Vision Pro'