#spir-v #compiler #glsl #shader #hlsl #graphics

sys glslang-sys

glslang 的原生 C 绑定

9 个版本 (4 个重大更新)

0.4.0 2024年8月2日
0.3.3 2024年7月29日
0.3.2 2024年2月9日
0.2.1 2024年2月8日
0.0.1 2015年5月9日

#352 in 编程语言

Download history 132/week @ 2024-05-04 95/week @ 2024-05-11 172/week @ 2024-05-18 129/week @ 2024-05-25 179/week @ 2024-06-01 283/week @ 2024-06-08 268/week @ 2024-06-15 148/week @ 2024-06-22 77/week @ 2024-06-29 145/week @ 2024-07-06 223/week @ 2024-07-13 138/week @ 2024-07-20 1004/week @ 2024-07-27 637/week @ 2024-08-03 524/week @ 2024-08-10 1203/week @ 2024-08-17

每月下载量 3,417
13 个 crate 中使用 (通过 glslang)

MIT/Apache 许可协议

7.5MB
146K SLoC

C++ 82K SLoC // 0.1% comments GLSL 56K SLoC // 0.0% comments Happy 4K SLoC Rust 2.5K SLoC Bitbake 361 SLoC Shell 296 SLoC // 0.6% comments Python 278 SLoC // 0.3% comments JavaScript 142 SLoC Forge Config 102 SLoC // 0.8% comments HLSL 45 SLoC // 0.1% comments

glslang-rs

glslang 的安全 Rust 绑定

Latest Version Docs License

用法

[dependencies]
glslang = "0.3"

示例

编译着色器

    use rspirv::binary::Disassemble;
    use glslang::*;

    #[test]
    pub fn test_compile() {
        // Acquire the compiler instance
        let compiler = Compiler::acquire().unwrap();
        let source = ShaderSource::try_from(String::from(
r#"
#version 450

layout(location = 0) out vec4 color;
layout(binding = 1) uniform sampler2D tex;

void main() {
    color = texture(tex, vec2(0.0));
}
"#,
        ))
        .expect("source");

        let limits = ResourceLimits::default();
        let input = ShaderInput::new(
            &source,
            &limits,
            ShaderStage::Fragment,
            &CompilerOptions::default(),
            None,
        );
        let shader = Shader::new(&compiler, input).expect("shader init");

        let mut program = Program::new(&compiler);

        program.add_shader(shader);
        program.link().expect("link error");

        let code = program.compile(ShaderStage::Fragment).expect("shader");
       
        // Use rspirv to disassemble
        let mut loader = rspirv::dr::Loader::new();
        rspirv::binary::parse_words(&code, &mut loader).unwrap();
        let module = loader.module();

        println!("{}", module.disassemble())
    }

依赖项