1个不稳定版本
0.1.0 | 2021年2月7日 |
---|
#457 在 图形API
24 星级 & 3 关注者
25KB
733 代码行
ShaderRoy
ShaderToy的Rust克隆,目前支持MacOS。
功能
cargo run <rust项目目录>
在单个MacOS窗口中显示一个 Metal 框架 片段着色器。- 您可以通过编辑并保存Rust项目源代码(在VS code或其他编辑器中)来更改片段着色器输出,窗口将实时更新。
- 您在Rust中编写着色器,但它会被编译成 Metal着色语言(C++的变体)
- 在着色器源代码中,您可以引用
const
INPUT
结构,它为每个帧提供输入,类似于ShaderToy中的 输入统一变量。尽管Metal没有像WebGL那样的全局统一变量概念,您也不需要将这些值作为参数通过函数传递。 - 您可以使用
mod <name>
和use <name>::*
来将着色器拆分到多个文件中。 - 在窗口开启时,您可以从命令行暂停、重启,甚至运行另一个着色器文件。
说明
- 克隆此存储库
- 运行
cargo run raymarching_eyes
- 编辑
examples/raymarching_eyes.rs
为什么选择Rust作为着色器源代码?更好的语法、更好的编辑器集成,以及因为它是一种有趣的技巧。它应该感觉就像是在编写Rust(感觉棒极了!)!与ShaderToy不同,Rust的类型检查器会立即警告大多数可能犯的错误。
Metal着色Rust语言
通常,您将编写的Rust代码将非常类似于C++ Metal着色语言API,但有一些差异。
INPUT
结构在shader_roy_metal_sl_interface中进行了文档说明。
API | MSL(C++) | Rust |
标量类型 |
|
使用与Metal类型相对应的标准Rust类型。
|
向量类型 |
|
使用泛型
|
构造函数 |
向量构造函数(如
|
在Rust中,这些名称遵循类型名称。您需要将这些名称作为方法调用。
|
访问构造函数 |
向量组件选择构造函数(如
|
在Rust中,您需要将这些名称作为方法调用
|
函数 |
|
数学、几何和常用函数需要作为方法调用
|
重命名的函数 |
|
名称遵循vek
|
具有不同参数顺序的方法 |
|
当其中一个参数与其他参数特殊时,它用作方法调用的接收者。
|
限制
模块
目前,只有与主文件位于同一目录的模块将被监视。只有同一目录中的文件支持mod <name>
,不支持<name>/mod.rs
。目前对path
属性在mod
上的支持也不存在。
Let绑定
变量不能重新声明。(目前如此)
构造函数
在Rust中,我们可能可以使用单个泛型vec2
构造函数为所有Vec2
编写。但这将需要实际使用rustc
将构造函数编译为具体的Metal C++构造函数。为了简化问题,这里的Rust绑定需要直接指定构造函数(如vec2bool
-> bool2
)。
开发
打印编译后的着色器而不打开窗口
cargo test -- --nocapture
依赖项
~7.5MB
~166K SLoC