AWESOME ENGINE / 技术指南

渲染与效果

了解如何绘制 2D 场景、应用 Bloom 和 Monitor,以及控制视图和粒子。

本页内容

一个场景,一张中间纹理

RenderManager 提供 Draw(const sf::Drawable&) 来绘制场景中的 SFML 对象。它在内部将绘制操作发送至 target_,即按配置尺寸创建的 sf::RenderTexture。

每帧开始时,BeginDrawing 清空目标并绘制背景。FinishDrawing 完成纹理更新、应用效果,然后返回由 Engine 显示到窗口的纹理。场景不需要直接管理窗口。

后处理链

参考代码选择了以下效果:

// Post Process Effects
 effects_.emplace_back(std::make_unique<EffectBloom>());
 effects_.emplace_back(std::make_unique<EffectMonitor>());
 // effects_.emplace_back(std::make_unique<EffectGlitch>());

只有着色器可用时才会加入 Bloom 和 Monitor。为了应用多个效果,FinishDrawing 交替使用两个目标,将上一阶段的输出作为下一阶段的输入。

效果 状态 功能
Bloom 已实现并启用 在一半分辨率下模糊图像,再将结果叠加到原图。
Monitor 已实现并启用 应用以分辨率和时间为参数的显示器着色器。
Glitch 实验性;已禁用 类和着色器存在,但加入管线的代码已注释。
颜色反转 实验性;未连接 类和着色器存在,但 RenderManager 没有将其加入效果链。

“实验性”描述的是当前集成状态,并不代表有预定的启用日期。

Bloom 的四个阶段

场景图像
       ↓
1. Downsample → 纹理 A,宽高各减半
       ↓
2. Blur(垂直) → 纹理 B
       ↓
3. Blur(水平) → 纹理 A
       ↓
4. 加法合成:原图 + 纹理 A

EffectBloom 从 Content/Shaders 加载 Default.vert、Downsample.frag、Blur.frag 和 Additive.frag。中间纹理的尺寸在构造效果时确定。

这一结构可以说明现有的渲染阶段,但没有已发布的测量数据可以据此给出性能提升百分比。

视图与坐标

管理器提供两个简单操作:

void RenderManager::SetView(const sf::View &view) {
  target_.setView(view);
}

void RenderManager::ResetView() {
  SetView(target_.getDefaultView());
}

它们用于访问 SFML 的 2D 视图。系统没有 CameraManager、3D 摄像机或自动跟随系统。CursorManager 可以查询转换到指定 sf::View 坐标下的光标位置。

Engine 的尺寸调整方法会记录新的窗口大小,但不会重建渲染目标。因此不能将其视为完整的动态分辨率支持。

粒子

ParticleManager 管理具有位置、速度、加速度、寿命、尺寸和颜色的粒子。Update 推进运动并删除寿命结束的粒子;Render 绘制随时间逐渐透明的方块。

默认上限为 128 个粒子。向量会预留该容量;当没有空间或寿命无效时,Emit 会丢弃新粒子。该上限是实现配置,并非对引擎最大容量的测量。

场景决定何时更新和绘制粒子。Engine 在切换场景时清除它们。Runner 使用该系统呈现移动时的尘土。

源码参考

基于已验证的源码。发现问题了吗? →