2 个版本
0.1.1 | 2023 年 5 月 14 日 |
---|---|
0.1.0 | 2023 年 5 月 13 日 |
#29 在 #wgsl
每月 38 次下载
用于 jit-spirv
25KB
452 行
JIT SPIR-V (实现)
jit-spirv-impl
实现 jit-spirv
的过程宏代码生成器。
使用方法
请参阅 jit-spirv 的文档 以获取使用方法。
许可证
本项目许可协议为以下之一:
- Apache 许可协议 2.0 版,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可协议 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
lib.rs
:
jit-spirv
第一个参数是包含文本着色器源代码的字符串切片。其他后续参数可以更精细地控制生成的代码以编译您的着色器。
源语言
jit-spirv
目前支持三种源语言
glsl
: 着色器源代码为 GLSL(默认启用);hlsl
: 着色器源代码为 HLSL(默认启用);wgsl
: 着色器源代码为 WGSL。
当启用 wgsl
功能时,WebGPU 的实验性 WGSL 支持可用,但您必须使用夜间工具链进行编译。由于 naga
后端限制,大多数额外参数将无效,SPIR-V 中只生成第一个入口点。
着色器阶段
以下着色器阶段受支持
vert
: 顶点着色器;tesc
: 规划控制着色器(Hull 着色器);tese
: 规划评估着色器(域着色器);geom
: 几何着色器;frag
: 片段着色器(像素着色器);comp
: 计算着色器;mesh
: (网格着色)网格着色器;task
: (网格着色)任务着色器;rgen
:(光线追踪) 光线生成着色器;rint
:(光线追踪) 交点着色器;rahit
:(光线追踪) 任意击中着色器;rchit
:(光线追踪) 最近击中着色器;rmiss
:(光线追踪) 失败着色器;rcall
:(光线追踪) 可调用着色器;
指定入口函数
默认情况下,编译器会寻找名为 main
的入口点函数。您也可以显式指定入口函数名称
jit_spirv!(hlsl_source, hlsl, vert, entry="very_main");
优化优先级
决定您希望 SPIR-V 进行多少优化
min_size
:优化为最小输出大小;max_perf
:优化为最佳性能;no_debug
:移除所有调试信息(如果您想反映 SPIR-V 并获取变量名称,请不要这样做)。
编译器定义
您也可以定义宏替换
jit_spirv!(glsl_source, vert,
D USE_LIGHTMAP,
D LIGHTMAP_COUNT="2");
您可以请求目标环境的特定版本
vulkan1_0
对于 Vulkan 1.0(默认,支持 SPIR-V 1.0);vulkan1_1
对于 Vulkan 1.1(支持 SPIR-V 1.3);vulkan1_2
对于 Vulkan 1.2(支持 SPIR-V 1.5)。opengl4_5
对于 OpenGL 4.5 核心配置文件。webgpu
对于 WebGPU。
当然,一旦您开始使用宏,这基本上意味着您正在变得非常动态,这个小小的软件包可能不足以满足需求。那么,可能是一个建立自己的着色器编译管道的好时机!
描述符自动绑定
如果您因为工作太累而懒得指定描述符绑定点,可以开启 auto_bind
jit_spirv!(r#"
#version 450 core
uniform sampler2D limap;
uniform sampler2D emit_map;
void main() {}
"#, glsl, frag, auto_bind);
但是,如果您没有自动化反射工具来获取实际的绑定点,不建议使用此功能。
WebGPU 的 Flip-Y
如果您打算为 WebGPU 编译 WGSL,由于 WebGPU 和 Vulkan 之间 NDC(归一化设备坐标)的差异,naga
默认会反转 Y 轴。如果这种校正是不希望看到的,您可以通过 no_y_flip
来选择不进行反转。
依赖关系
~300–750KB
~18K SLoC