我自己构建了 Shader 语言
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,或分享对矩阵乘法方式的看法。