1个不稳定版本
0.1.0 | 2020年3月22日 |
---|
在图形API中排名1066
每月下载量53次
1MB
32K SLoC
isf

解析、反序列化和序列化ISF(交互式着色器格式)。
实现方式遵循规范网站中“ISF规范版本2.0”部分所描述的内容。
parse函数可以将给定的GLSL字符串解析成Isf实例。该Isf类型代表该格式的完全结构化表示,包括类型化的Input。
测试
仓库包含了规范网站提供的“ISF测试/教程过滤器”集合中的所有着色器以及"Vidvox/ISF-Files"仓库中所有着色器,用于自动测试。这些测试按照以下步骤对每个着色器执行完整的往返过程
- 从文件中读取GLSL字符串。
- 解析顶层的字典。
- 将JSON反序列化到
Isf
结构体。 - 将
Isf
结构体序列化回JSON字符串。 - 再次将新的JSON字符串反序列化到
Isf
结构体。 - 断言第一个
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