想象一下下面的例子:

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插件,据我所知,应该可以提供这样的功能,但编写我自己的插件相当复杂,我想知道是否已经有一个好的plugin/lib/标准方式来包含资源文件.另一点是,它应该在不使用手动链接器+指针方式的情况下工作.

推荐答案

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

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

shader.glsl文件应该位于源文件旁边,这样才能工作.

非UTF-8数据也有include_bytes!()个:

static SHADER: &'static [u8] = include_bytes!("main.rs");

不要将它们与include!混为一谈,后者会导入文件as Rust code.

Rust相关问答推荐

如何在Rust中在屏幕中间打印内容?

PyReadonlyArray2到Vec T<>

如何找到一个数字在二维数组中的位置(S)?

我怎样才能从一个Rust 的日期中go 掉3年?

如何在Bevy/Rapier3D中获得碰撞机的计算质量?

制作一片连续整数的惯用Rust 方法?

"value is never read警告似乎不正确.我应该忽略它吗?

在Rust中宏的表达式中提取对象

如何指定不同的类型来常量Rust中的泛型参数?

这是不是在不造成嵌套的情况下从枚举中取出想要的变体的惯用方法?

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

如何将单个 struct 实例与插入器一起传递到Rust中的映射

如何防止Cargo 单据和Cargo 出口发布( crate )项目

为什么`str`类型可以是任意大小(未知大小),而`string`类型的大小应该是已知的?

有没有办法使用 NASM 语法进行内联汇编?

如何在没有 `make_contiguous()` 的情况下对 VecDeque 进行排序或反转?

为什么这个 Trait 无效?以及改用什么签名?

在 Rust 中组合特征的不同方法是否等效?

为什么这里需要类型注解?

返回 &str 但不是 String 时,borrow 时间比预期长