#spir-v #vulkan #glsl

rasen

从数据流图中构建 SPIR-V 模块

7 个版本 (破坏性更新)

使用旧的 Rust 2015

0.12.0 2018年4月21日
0.11.0 2018年4月7日
0.10.0 2018年1月7日
0.9.0 2018年1月3日
0.1.0 2016年9月14日

渲染 中排名 126


用于 rasen-dsl

MIT 许可证

115KB
2.5K SLoC

rasen

rasen 包含核心图编译器本身。它提供了图构建工具(Graph 结构体),各种类型(rasen::types::*)和操作(rasen::node::* 定义),以及 SPIR-V 编译工具(ModuleBuilder 结构体)。

API 故意设计为低级,因为核心编译器的用例是作为游戏引擎中基于图的材质编辑器的后端。完全可以通过创建一个 Graph 结构体并逐节点构建模块来使用这个包,但是这种方法对于“静态”着色器来说通常比较冗长。

extern crate rasen;

use rasen::prelude::*;

fn main() {
    let mut graph = Graph::new();

    // A vec3 input at location 0
    let normal = graph.add_node(Node::Input(0, TypeName::VEC3, VariableName::Named(String::from("a_normal"))));

    // Some ambient light constants
    let min_light = graph.add_node(Node::Constant(TypedValue::Float(0.1)));
    let max_light = graph.add_node(Node::Constant(TypedValue::Float(1.0)));
    let light_dir = graph.add_node(Node::Constant(TypedValue::Vec3(0.3, -0.5, 0.2)));

    // The Material color (also a constant)
    let mat_color = graph.add_node(Node::Constant(TypedValue::Vec4(0.25, 0.625, 1.0, 1.0)));

    // Some usual function calls
    let normalize = graph.add_node(Node::Normalize);
    let dot = graph.add_node(Node::Dot);
    let clamp = graph.add_node(Node::Clamp);
    let multiply = graph.add_node(Node::Multiply);

    // And a vec4 output at location 0
    let color = graph.add_node(Node::Output(0, TypeName::VEC4, VariableName::Named(String::from("o_color"))));

    // Normalize the normal
    graph.add_edge(normal, normalize, 0);

    // Compute the dot product of the surface normal and the light direction
    graph.add_edge(normalize, dot, 0);
    graph.add_edge(light_dir, dot, 1);

    // Restrict the result into the ambient light range
    graph.add_edge(dot, clamp, 0);
    graph.add_edge(min_light, clamp, 1);
    graph.add_edge(max_light, clamp, 2);

    // Multiply the light intensity by the surface color
    graph.add_edge(clamp, multiply, 0);
    graph.add_edge(mat_color, multiply, 1);

    // Write the result to the output
    graph.add_edge(multiply, color, 0);

    let bytecode = build_program(&graph, ShaderType::Fragment).unwrap();
    // bytecode is now a Vec<u8> you can pass to Vulkan to create the shader module
}

依赖项

~11MB
~224K SLoC