我自己构建了 Shader 语言

发布: (2025年12月29日 GMT+8 05:49)
3 min read
原文: Dev.to

Source: Dev.to

坐标空间

在标准 GLSL 中,vec4 仅仅是一个 vec4。编译器并不知道该向量表示的是 世界空间模型空间 还是 裁剪空间。如果不小心把视图空间的向量乘以模型矩阵,编译时不会报错;相反,你会得到黑屏或错误的光照效果,并且需要花时间调试这种混用。

核心思路

Cast 为坐标空间引入了强类型:

// Cast 语法
let modelPos : vec4 = ...;
let matrix   : mat4 = ...;

// 因为类型匹配,这行代码可以工作
let worldPos = matrix * modelPos;

// 这行代码会抛出编译错误
let wrong = projectionMatrix * modelPos;

通过在类型中编码空间( , , 等),编译器能够验证矩阵‑向量乘法在语义上是否正确。

简化语法

典型的 GLSL 表达式:

max(pow(dot(N, L), 32.0), 0.0)

从里向外阅读会比较繁琐。Cast 提出一种从左到右、链式调用的写法:

N.dot(L).pow(32.0).max(0.0)

添加新特性

接收者类型(受 Go 启发)

Go 示例:

type SomeStruct struct {
    width, height int
}

func (r *SomeStruct) SomeFunction() { ... }

Cast 采用了类似的模式:

struct SomeStruct { x: float, y: float }

fn (SomeStruct) SomeFunction() { ... }

结构化 Uniform/IO 块

为了让着色器文件更有条理,Cast 允许对 uniform、输入和输出进行分组:

uniform {
    // uniform 声明
}

in {
    // 输入声明
}

out {
    // 输出声明
}

当前状态

Cast 目前是一个 概念验证(Proof of Concept)。它尚未达到生产级别;许多标准特性缺失,编译器在某些情况下可能会崩溃。

征求反馈

这些概念——显式坐标空间、链式调用语法以及接收者类型——仍在讨论中。欢迎对语法和架构提出意见。可以查看源码、提交 issue,或分享对矩阵乘法方式的看法。

Cast repository

Back to Blog

相关文章

阅读更多 »

ScrollView 与 SwiftUI 中的坐标空间

基于滚动的 UI 在现代应用中随处可见——collapsing headers、parallax effects、sticky toolbars、section pinning、scroll‑driven animations、pull‑to‑refresh……