有没有一种好的方法将外部资源数据包含到Rust源代码中?

28

想象下面的例子:

let SHADER: &'static str = "
#version 140

attribute vec2 v_coord;
uniform sampler2D fbo_texture;
varying vec2 f_texcoord;

void main(void) {
    gl_Position = vec4(v_coord, 0.0, 1.0);
    f_texcoord = (v_coord + 1.0) / 2.0;
}";

fn main() {
    // compile and use SHADER
}

当然,您可以像上面展示的那样内联编写着色器,但是在使用外部软件设计着色器或具有多个着色器时,这会变得非常复杂。您还可以从外部文件加载数据,但有时您只想提供一个小型可执行文件,而无需弄清资源存储的位置。

如果解决方案还适用于二进制文件(例如图标、字体),那就太好了。

我知道编写Rustc插件是可能的,并且据我所知,应该可以提供这样的功能,但编写自己的插件相当复杂,我想知道是否已经存在良好的插件/库/标准方法来包含资源文件。另一点是它应该可以在不利用手动链接器+指针方式的情况下工作。

1个回答

40

我相信您正在寻找include_str!()宏:

static SHADER: &'static str = include_str!("shader.glsl");

shader.glsl文件需要与源文件放置在同一目录下才能正常工作。

对于非UTF-8数据,也可以使用include_bytes!()

static SHADER: &'static [u8] = include_bytes!("main.rs");
不要将这些与导入文件作为 Rust 代码的 include! 混淆。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接