#sprite #glium #rendering-engine

bin+lib radiant-rs

线程安全的 Rust 精灵渲染引擎,具有友好的 API 和自定义着色器支持

29 个版本 (12 个重大更新)

使用旧的 Rust 2015

0.13.1 2018年7月16日
0.12.6 2018年5月25日
0.12.0 2018年3月24日
0.9.1 2017年12月31日
0.1.1 2016年11月9日

#41 in 渲染引擎


2 个软件包中使用 (通过 radiant-utils)

MIT 许可

1.5MB
4.5K SLoC

radiant-rs

具有友好 API、无等待发送+同步绘制目标和自定义着色器支持的 Rust 精灵渲染引擎。

在此处开始和使用参考.

要编译示例,请使用例如 cargo run --release --example demo_glare。请参阅示例文件夹中的其他可用示例。

示例的一些截图

examples/demo_glare.rs examples/05_tiles.rs examples/demo_blobs.rs examples/07_to_texture.rs


lib.rs:

具有友好 API、无等待发送+同步绘制目标和自定义着色器支持的 Rust 精灵渲染引擎。

示例

示例文件夹包含多个小型示例。它们可以通过 cargo run --example <example name> 运行,例如 cargo run --example demo_blobs 运行 demo_blobs.rs。

基本渲染

Radiant 提供了一个可选的 Display 结构体,用于创建窗口和处理事件。或者,您也可以向 Radiant 提供一个 Glium Display(或 Display 和 EventsLoop)。请参阅下面的详细信息。否则,以下步骤可生成输出

  1. 使用 Display::builder() 创建一个 display。这代表窗口/屏幕。
  2. 使用 Renderer::new() 创建一个 renderer。它用于在rendertargets(如display)上绘制。
  3. 使用 context() 方法从renderer获取上下文。这对于资源加载是必需的。
  4. 使用例如 Font::from_file()Sprite::from_file() 加载精灵或字体。
  5. 使用 Layer::new() 创建所需数量的绘图层。
  6. 使用 Font::write()Sprite::draw() 方法在层上绘制。
  7. 使用 Display::clear_frame() 准备一个新帧并清除它。(如果您不想清除,请使用 Display::prepare_frame() 代替。)
  8. 使用 Renderer::draw_layer() 将层的内容绘制到显示中。
  9. 通过 Display::swap_frame() 使帧可见。

绘制到纹理/后处理

后处理器是自定义效果,可以是简单的单个着色器程序,也可以将多个着色器和纹理组合成单个输出。

渲染器有一个方法 Renderer::render_to(),它接受一个rendertarget(例如纹理)和闭包。在闭包内绘制的任何内容都将渲染到纹理上。

同样,使用 Renderer::postprocess() 通过后处理器进行渲染。

这些方法可以像这里所示一样组合/嵌套。

renderer.render_to(&surface, || {
renderer.postprocess(&effect1, &effect1_arguments, || {
renderer.postprocess(&effect2, &effect2_arguments, || {
//...
renderer.draw_layer(&layer, 1);
});
//... maybe draw here with only effect 1? ...
});
//... or here without any postprocessor? ...
});

精灵表

目前,精灵表必须是水平或垂直对齐的一个或多个精灵帧的表。每个帧可以包含多个与帧正交对齐的组件。组件可以是精灵的颜色图像、着色器的光照或扭曲贴图等。

可以从原始图像数据和描述精灵布局的 SpriteParameters 结构或直接从文件创建精灵。从文件加载时,文件名需要表示精灵格式,例如 battery_lightmapped_128x128x15x2 将是使用两个组件的 128x128 精灵的 15 帧。这是它可能看起来像的比例。颜色组件在上行,光照组件在下行

Spritesheet

自定义着色器

Radiant 支持使用自定义片段着色器。这些是正常的 glsl 着色器。为了简化对默认采样器(它可能是一个 sampler2DArray 或 sampler2D,具体取决于绘制的内容)的访问,源中注入了一个包装器。包装器提供了类似于 glsl 的 texture*() 函数的 sheet*() 函数。这仅适用于默认采样器。可以向着色器添加自定义统一变量,包括采样器,这些变量可以使用 texture*() 函数进行采样。

可用默认输入

  • uniform mat4 u_view 如果适用,则是视图矩阵,否则是单位矩阵。
  • uniform mat4 u_model 如果适用,则是模型矩阵,否则是单位矩阵。
  • in vec2 v_tex_coords 纹理坐标。
  • in vec4 v_color 颜色乘数。对于图层,这是精灵颜色 * 图层颜色。

要访问默认的采样器,提供了以下包装器:

  • vec2 sheetSize() 获取纹理的尺寸。
  • vec4 sheet(in vec2 texture_coords) 从纹理中获取像素。
  • vec4 sheetComponent(in vec2 texture_coords, in uint component) 采样特定精灵组件,而不是由 Renderer::draw_layer() 设置的默认组件。
  • vec4 sheetOffset(in vec2 texture_coords, in ivec2 offset) 类似于 textureOffset()。

示例:(这是 radiant 默认使用的着色器。)

#version 140

in vec2 v_tex_coords;
in vec4 v_color;

out vec4 f_color;

void main() {
f_color = sheet(v_tex_coords) * v_color;
}

多线程绘制

基本渲染 列表中的步骤 1-5 开始。然后...

  1. 将字体、精灵和图层包装在 Arc 中。
  2. 为每个需要其内容的线程克隆 Arc。渲染上下文可以直接克隆。
  3. 将克隆的副本移入线程。
  4. 从任何线程(s)绘制到您的图层,加载精灵等。图层对绘制操作是非阻塞的,对其他操作(例如矩阵修改)是阻塞的。

在创建 Renderer 的线程中使用 基本渲染 列表中的步骤 7-9 完成渲染;它和 Display 都没有实现 Send

与现有 glium 项目(或任何支持的后端)集成

Radiant 可以使用 backend 模块中提供的 API 与支持的后端一起使用。 10_glium_less11_glium_more 示例展示了两种不同的方法。

方法 "more":跳过创建 Radiant Display,使用 backend::create_renderer() 从 Glium Display 创建渲染器。然后使用 backend::target_frame 将渲染器指向目标 Glium Frame。

方法 "less":使用 backend::create_display() 从 Glium Display 和 EventsLoop 创建 Radiant Display。然后使用 backend::take_frame() 从 Radiant "借用" Glium Frame。这种方法让您保留 Radiant 的窗口/事件处理。

发现了问题?缺少功能?

如果在使用此库时遇到任何问题,请提交一个错误报告。特别是,它只在有限数量的显卡上进行了测试,因此我预计会有关于未经测试的硬件的问题。

依赖项

~16–30MB
~354K SLoC