#glsl-shader #shaders #glsl #wgpu #graphics #visualization

bin+lib nuance

一个在GPU上运行着色器的工具。也是wgpu-rs的良好演示应用程序。

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 2018年8月28日

#86 in 渲染

Apache-2.0

84KB
2K SLoC

Nuance

Crates.io Crates.io

一个在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