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)
1.5MB
4.5K SLoC
radiant-rs
具有友好 API、无等待发送+同步绘制目标和自定义着色器支持的 Rust 精灵渲染引擎。
要编译示例,请使用例如 cargo run --release --example demo_glare
。请参阅示例文件夹中的其他可用示例。
示例的一些截图
lib.rs
:
具有友好 API、无等待发送+同步绘制目标和自定义着色器支持的 Rust 精灵渲染引擎。
示例
示例文件夹包含多个小型示例。它们可以通过 cargo run --example <example name>
运行,例如 cargo run --example demo_blobs
运行 demo_blobs.rs。
基本渲染
Radiant 提供了一个可选的 Display 结构体,用于创建窗口和处理事件。或者,您也可以向 Radiant 提供一个 Glium Display(或 Display 和 EventsLoop)。请参阅下面的详细信息。否则,以下步骤可生成输出
- 使用
Display::builder()
创建一个 display。这代表窗口/屏幕。 - 使用
Renderer::new()
创建一个 renderer。它用于在rendertargets(如display)上绘制。 - 使用
context()
方法从renderer获取上下文。这对于资源加载是必需的。 - 使用例如
Font::from_file()
或Sprite::from_file()
加载精灵或字体。 - 使用
Layer::new()
创建所需数量的绘图层。 - 使用
Font::write()
或Sprite::draw()
方法在层上绘制。 - 使用
Display::clear_frame()
准备一个新帧并清除它。(如果您不想清除,请使用Display::prepare_frame()
代替。) - 使用
Renderer::draw_layer()
将层的内容绘制到显示中。 - 通过
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 帧。这是它可能看起来像的比例。颜色组件在上行,光照组件在下行
自定义着色器
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 开始。然后...
- 将字体、精灵和图层包装在
Arc
中。 - 为每个需要其内容的线程克隆
Arc
。渲染上下文可以直接克隆。 - 将克隆的副本移入线程。
- 从任何线程(s)绘制到您的图层,加载精灵等。图层对绘制操作是非阻塞的,对其他操作(例如矩阵修改)是阻塞的。
在创建 Renderer
的线程中使用 基本渲染 列表中的步骤 7-9 完成渲染;它和 Display
都没有实现 Send
。
与现有 glium 项目(或任何支持的后端)集成
Radiant 可以使用 backend 模块中提供的 API 与支持的后端一起使用。 10_glium_less
和 11_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