5个不稳定版本
0.3.2 | 2021年9月1日 |
---|---|
0.3.1 | 2021年8月31日 |
0.3.0 | 2021年7月25日 |
0.2.0 | 2021年5月12日 |
0.0.0 |
|
#86 in 渲染
84KB
2K SLoC
Nuance
一个在GPU上运行你的着色器的工具。
加载示例着色器:shaders/demo/foamy_water.frag
由 k-mouse (2016-11-23) 制作 https://www.shadertoy.com/view/llcXW7
安装
使用cargo安装
$ cargo install --locked nuance
从源码构建时,请参阅开发。
或从发布页面下载预构建的二进制文件。预构建的二进制文件目前适用于Windows (x86_64-pc-windows-msvc) 和 Linux (x86_64-unknown-linux-gnu)。
用法
直接运行或使用nuance -H
强制使用您机器上最佳GPU。默认情况下,nuance选择功耗最低的GPU。
着色器
Nuance允许您运行自定义片段着色器。您还可以使用直接编译为SpirV的着色器,前提是它使用Nuance头文件编译。
有关从GLSL的完整更改列表,请参阅手册。
自定义参数
您可以使用特殊接口块指定着色器的额外参数。在编译您的着色器时,将从源代码解析参数以生成滑块和其他适当的UI元素。然后,着色器源代码将转换成正确的GLSL以进行编译。示例
// layout(params) indicates that this block is the special one to be parsed.
layout(params) uniform Params {
// layout(min, max, init) to modify each parameters settings
layout(min = 0, max = 100, init = 1) float fSlider0;
layout(min = 0, max = 20) float fSlider1;
};
void main() {
// You can use special values like <param>.min and <param>.max, they will be replaced by the settings defined
// in the params block
fragColor = vec4(fSlider0 / fSlider0.max, fSlider1 / fSlider1.max, 0.0, 1.0);
}
为什么使用这种指定参数的实现?
"劫持"布局限定符使我能够使用现有的GLSL解析器。它将这些限定符解析为任意标识符,这提供了极大的灵活性。
示例
此仓库包括一些示例,位于shaders/
下。其中一些不是我的作品,仅在此用于演示目的。它们归各自的所有者所有。
开发
我们使用 shaderc-rs
将 GLSL 着色器编译成 spirv。因此,强烈建议安装 Vulkan SDK 并设置 VULKAN_SDK
环境变量,以便找到预构建的 shaderc 库。如果不这样做,shaderc 将从源代码下载并构建 Vulkan 库,这大约占整个应用程序构建时间的 90%。
待办事项
我应该按照无特定顺序处理的想法和任务。
- 合并参数 uniform 块与 push_constant 块
- 预处理器错误处理与报告
- 完成错误处理(当前如果出现问题则崩溃)
- GPU 热切换(当你需要一些额外的 GPU 力量时)
- 将纹理绑定为输入
- 将缓冲区绑定为输出
- 声音处理(输入和输出)
- 保存为 gif 或视频
- 直接从 shadertoy.com 加载着色器(需要转换全局变量)
- 着色器编辑器(代码编辑器,GLSL 突出显示)
- 适用于 GLSL 着色器的标准库,包含常用函数
- 将自定义 GLSL 语言扩展内置到预处理器中,以实现更流畅的语言
- GLSL 的自定义解析器
- 支持 rust-gpu 着色器
依赖项
~67MB
~1M SLoC