8个版本

新版本 0.7.4 2024年8月19日
0.7.3 2024年8月19日
0.7.2 2023年11月5日
0.7.1 2023年4月4日
0.5.0 2021年4月6日

#1012 in 解析器实现

Download history 1/week @ 2024-05-21 8/week @ 2024-07-02 83/week @ 2024-08-13

91 每月下载量
用于 glslt_cli

MIT 协议

98KB
2K SLoC

glslt

glslt是支持GLSL模板编译器转换的主要库。如果您正在构建依赖于转换GLSLT代码的系统,您将希望直接与该库交互,而不是使用glsltc提供的命令行界面。

用法

Rust包

glslt包操作由glsl-lang包生成的语法树。

use glslt::glsl_lang::{ast::*, parse::IntoParseBuilderExt};
use glslt::transform::{Unit, TransformUnit};

let glsl_src = r#"
float sdf3d(in vec3 p);
float colort();

float sdSphere(vec3 p, float r) {
    return length(p) - r;
}

float opElongate(in sdf3d primitive, in colort C, in vec3 p, in colort D, in vec3 h) {
    vec3 q = p - clamp(p, -h, h);
    return C() * primitive(q) * D();
}

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
    float sz = 5.;
    fragColor = vec4(vec3(opElongate(sdSphere(_p, sz), 1.0, vec3(fragCoord, 0.), 2.0, vec3(1., 2., 3.))), 1.0);
}
"#;

// Parse the GLSLT source code
let tu: TranslationUnit = glsl_src
    .builder()
    .context(&glslt::parse::make_parse_context(None))
    .parse()
    .expect("failed to parse GLSLT source")
    .0;

// Create the transform unit
let mut unit = Unit::new();

// Parse declarations
for decl in tu.0.into_iter() {
    unit.parse_external_declaration(decl).expect("failed to parse declaration");
}

// Generate the result
let tu = unit.into_translation_unit().expect("failed to generate output");

// Transpile the syntax tree to GLSL source
let mut output_src = String::new();
glsl_lang::transpiler::glsl::show_translation_unit(
    &mut output_src,
    &tu,
    glsl_lang::transpiler::glsl::FormattingState::default(),
).expect("failed to generate GLSL");

Python库

如果您通过pip install glsltmaturin develop安装了glslt库,您可以使用GLSLT编译器的Python接口。

import glslt

# Parse the `sdf.glsl` file with `my-glsl-lib/include` being a system include
# directory for #include resolution
translation_unit = glslt.parse_files(["sdf.glsl"], ["my-glsl-lib/include"])

# Create a new minimizing transform unit
unit = glslt.MinUnit()

# Add the parsed declarations to the transform unit
unit.add_unit(translation_unit)

# Get the output of the transform
result = unit.to_translation_unit(["mainImage"])

# Print the GLSL code
print(result.to_glsl())

作者

Alixinne [email protected]

依赖

~5–13MB
~145K SLoC