AWESOME ENGINE / 技術ガイド

描画とエフェクト

2D シーンの描画、Bloom と Monitor の適用、ビューとパーティクルの制御を説明します。

このページの内容

1 つのシーンと中間テクスチャ

RenderManager は、シーンの SFML オブジェクトを描くために Draw(const sf::Drawable&) を提供します。内部では、設定サイズで作られた sf::RenderTexture である target_ に描画を送ります。

フレームの開始時、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 は 2 つのターゲットを交互に使い、あるパスの出力を次のパスの入力にします。

エフェクト 状態 機能
Bloom 実装済み・有効 半分の解像度で画像をぼかし、元の画像に加算します。
Monitor 実装済み・有効 解像度と時間をパラメーターとするモニターシェーダーを適用します。
Glitch 実験的・無効 クラスとシェーダーは存在しますが、パイプラインへの追加はコメントアウトされています。
色反転 実験的・未接続 クラスとシェーダーは存在しますが、RenderManager はチェーンに追加しません。

実験的という表示は現在の統合状態を説明するもので、有効化の予定日を示すものではありません。

Bloom の 4 段階

シーンの画像
       ↓
1. Downsample → テクスチャ A、幅と高さは半分
       ↓
2. Blur(垂直) → テクスチャ B
       ↓
3. Blur(水平) → テクスチャ A
       ↓
4. 加算合成:元画像 + テクスチャ A

EffectBloom は Content/Shaders から Default.vert、Downsample.frag、Blur.frag、Additive.frag を読み込みます。中間テクスチャのサイズはエフェクト構築時に決まります。

この構成から実装済みのパスは説明できますが、性能向上率を示せる公開測定値はありません。

ビューと座標

マネージャーは次の 2 つの簡単な操作を提供します。

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 は移動時の砂ぼこりにこのシステムを利用しています。

参照ソース

確認済みのソースコードに基づいています。問題を見つけましたか? →