#shader #glsl #interactive #format

isf

交互式着色器格式(ISF)的解析、反序列化和序列化

1个不稳定版本

0.1.0 2020年3月22日

图形API中排名1066

Download history 1/week @ 2024-05-18 9/week @ 2024-07-06 2/week @ 2024-07-13 42/week @ 2024-07-27

每月下载量53

MIT/Apache

1MB
32K SLoC

F# 31K SLoC // 0.0% comments Rust 340 SLoC

isf 构建状态 Crates.io Crates.io docs.rs

解析、反序列化和序列化ISF(交互式着色器格式)。

实现方式遵循规范网站中“ISF规范版本2.0”部分所描述的内容。

parse函数可以将给定的GLSL字符串解析成Isf实例。该Isf类型代表该格式的完全结构化表示,包括类型化的Input

测试

仓库包含了规范网站提供的“ISF测试/教程过滤器”集合中的所有着色器以及"Vidvox/ISF-Files"仓库中所有着色器,用于自动测试。这些测试按照以下步骤对每个着色器执行完整的往返过程

  1. 从文件中读取GLSL字符串。
  2. 解析顶层的字典。
  3. 将JSON反序列化到Isf结构体。
  4. Isf结构体序列化回JSON字符串。
  5. 再次将新的JSON字符串反序列化到Isf结构体。
  6. 断言第一个Isf实例与第二个实例相同。

感谢Vidvox团队允许我们将这些测试包含在仓库中,以便进行便捷的自动化测试!

示例

将GLSL字符串解析到ISF结构体的过程如下

let isf = isf::parse(&glsl_str).unwrap();

请参阅 Isf 结构体文档,了解您可以使用它做什么!

以下是上述描述的 tests/roundtrip.rs 测试的副本

let test_files_path = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("test_files");
assert!(test_files_path.exists());
assert!(test_files_path.is_dir());
for entry in std::fs::read_dir(test_files_path).unwrap() {
    let entry = entry.unwrap();
    let path = entry.path();
    let ext = path.extension().and_then(|s| s.to_str());
    if ext == Some("fs") || ext == Some("vs") {
        let glsl_str = std::fs::read_to_string(&path).unwrap();
        let isf = match isf::parse(&glsl_str) {
            // Ignore non-ISF vertex shaders.
            Err(isf::ParseError::MissingTopComment) if ext == Some("vs") => continue,
            Err(err) => panic!("err while parsing {}: {}", path.display(), err),
            Ok(isf) => isf,
        };
        let isf_string = serde_json::to_string_pretty(&isf).unwrap();
        let isf2 = serde_json::from_str(&isf_string).unwrap();
        assert_eq!(isf, isf2);
    }
}

关于

此crate的开发是为了创建一个基于nannou(创意编码框架)的ISF实时编码环境的一个步骤。

依赖项

~0.7–1.6MB
~35K SLoC