レンダリング
Turian は単一の SDL3-GPU レンダラー(Vulkan / Metal / D3D12)で 3D をレンダリングします。 このレンダラーはエディタのビューポートと出荷されるゲームで共有されるため、 編集中に見たものがそのままゲームで描画されます:メタリックラフネス PBR、方向影マッピング、 法線マッピング、圧縮テクスチャ(BCn / KTX2)の直接サポート。
2つの小さなモジュール
レンダラーはエンジンに依存しないパッケージに分割されているため、エディタの UI ツールキットに結合されません:
gpu— SDL3 の GPU API 上の薄いウィンドウ + GPU デバイスプラットフォームレイヤー。OS ウィンドウ、デバイス、スワップチェーンを所有し、変換された SDL3 API とフレームごとのコマンドバッファを公開します。また、デバッグに便利なスクリーンショットヘルパー(テクスチャ読み戻し → TGA)も提供します。render— シーンレンダラー:PBR パイプライン、シャドウパス、メッシュ/テクスチャアップロード、描画ループ。gpuとエンジンのシーン/アセット型に依存し、コールバックを介して GPU デバイス、カラーテャーゲット、シーンノード、アセットバイトを受け取ります——UI 依存関係はありません。
エディタは render に dvui のデバイスとオフスクリーンターゲットを提供し、ゲームは SDL ウィンドウのスワップチェーンを提供します。どちらも同じバイトソースシームを介して GUID でアセット(メッシュ、テクスチャ、マテリアル)を解決します——エディタでは調理済みの .cache から、ゲームではパッケージ化された .oap から。
ソフトウェアフォールバック
SDL3 GPU が利用できない場合(例:ヘッドレス CI)、ゲームは CPU ソフトウェアラスタライザーにフォールバックします。通常のビルドでは GPU パスがデフォルトです。
ライティング
1フレームあたり最大8つのライト(方向光 / 点光源 / スポットライト)がサポートされています。最初の影を投射する方向光はカスケードシャドウマップ(4スプリット、各スプリットはシャドウアトラスの独自のPCFフィルター処理されたストリップを持つ)を駆動するため、影のディテールはカメラの近くでシャープさを保ちつつ、大きなシーンでのカバレッジを犠牲にしません。メタルは環境プローブがない場合に黒くならないよう、環境スペキュラー項を取得します。Light および MeshRenderer コンポーネントについてはコンポーネントを、PBR マテリアルモデルについてはアセットとマテリアルを参照してください。
イメージベースドライティング
Environment コンポーネント(シーンごとに最大1つアクティブ)は、正距円筒図法のHDRマップを指し、スカイボックスの背景と環境ライティングの両方を駆動します:
- スカイボックス — 正距円筒テクスチャは視野レイの方向によって直接サンプリングされます。
show_skyboxをオフにすると、環境寄与を維持したまま、レンダラーのプレーンなクリアカラーにフォールバックします。これは、忙しいHDRIが注意を競うことなくジオメトリ/マテリアルを反復するのに便利です。 - 拡散放射照度 — 環境アップロードごとに1回、次数2の球面調和基底に投影されます(ピクセルあたりの評価が安価で、拡散のみの項ではすでに正しい——完全な拡散キューブマップ畳み込みは不要)。
- 鏡面反射 — GGX重要度サンプリングされたプリフィルタリング済みキューブマップ:アップロード時に、正距円筒マップがベースキューブマップに変換され、各ミップが増加する粗さでプリフィルタリングされ(標準的な分割サムアプローチ)、シェーディング時に反射方向と粗さで選択されたミップによってサンプリングされます。これは以前の正距円筒ミップ近似(UV空間でボックスフィルター処理するもの)を置き換えました——極付近で過度にぼやけ、グレイジング角度で実際のGGXローブ形状がありませんでした。環境BRDF項は、ベイクされた2D LUTではなくKarisの解析近似を使用します。
これらはすべて環境テクスチャのアップロードごとに1回発生し、フレームごとではありません——初期キューブマップ生成以外の実行時コストはありません。
カラーマネジメント
ライティングは線形空間で実行されます:カラーテクスチャ(アルベド、エミッシブ)は sRGB としてサンプリングされ——タグ付けされた DDS/KTX2 テクスチャの場合は GPU サンプラーによって線形にデコードされ、インポーターが PNG/JPEG ソースにベイクする小さなエンベロープを介して処理されます——一方、データマップ(法線、メタリックラフネス、オクルージョン)は全体を通して線形のままです。メインパスは、トーンマップされたカラーを直接書き込むのではなく、HDR(R16G16B16A16_FLOAT)ターゲットにレンダリングします。ポストプロセスコンポジットパスは、レンダーターゲットとスワップチェーンが UNORM(sRGB ではない)になった後、最後に ACES フィルムトーンマップとそれに続くガンマ 2.2 エンコーディングを適用します。ソフトウェアラスタライザーは、GPU パスと CPU パスの間でパリティを保つために、両方のステップをシェーディング関数内で直接ミラーリングします(個別のポストプロセスステージはありません)。
ポストプロセッシング
GPU のみのポストプロセススタックは、ライトパスの後、トーンマッピングの前/と組み合わせて実行されます:ビネット、チャンネルごとの RGB リフト/ガンマ/ゲインカラーグレーディング、ブルーム。設定はカメラではなく、PostProcessVolume コンポーネントに格納されます——任意のシーンオブジェクトに追加すると、グローバル(シーン全体に影響)またはローカル(そのオブジェクトの周りのボックス/スフィア領域、端に blend_distance のフェードオフあり)になります。各エフェクトカテゴリには独自の有効化トグルがあります:
- ビネット —
intensity(0 = オフ)、radius、smoothnessが中心から外側への放射状の暗化を制御します。 - カラーグレーディング —
lift、gamma、gain(それぞれ RGB トリプル)が Unity のグレーディングホイールと同じリフト/ガンマ/ゲインモデルを適用します:リフトはシャドウ、ガンマはミッドトーン、ゲインはハイライトをシフトし、各チャンネルが独立しているため、明るさだけでなくカラーバランスをシフトできます(例:暖かいシャドウ、冷たいハイライト)。 - ブルーム —
threshold(ピクセルが光る線形 HDR 輝度)、intensity(0 = オフ)、radius(グローの広がり)がマルチミップデュアルフィルターブルームを駆動するため、エミッシブまたはスペキュラーブローアウトしたサーフェスは、小さな固定半径のブラーではなく、柔らかく広いハローで光ります。
すべてのカテゴリが無効になっている PostProcessVolume は完全なノーオプです——ボリュームがまったくないシーンは、ポストプロセッシングがない場合とビット単位で同じレンダリング結果になります。
重なり合うボリューム
複数のボリュームが同時にカメラに影響を与えることができます——レベル全体のグローバルな「ルック」に加えて、特定の部屋や瞬間のローカルボリュームなど。オーバーラップは優先度(高い方が勝ち)と距離ベースの重み(ローカルボリュームの形状内では1、blend_distance 全体で0にフェード)によって解決され、カテゴリごとにブレンドされるため、1つのボリュームがビネットだけをオーバーライドし、グレーディングとブルームは他のアクティブなボリュームから引き続き取得されます。ブレンドは毎フレームカメラの実際の位置に対して評価されるため、エディタでボリュームの境界を通過すると、出荷されるゲームと同じフェードがプレビューされます。
カスタムエフェクト
エンジン/プラグインコードは、subsystems/render/postprocess.zig の postprocess.registerEffect を介して、追加のポストプロセスパスを登録できます——HDR バッファを直接読み書きするため、独自のブライトパスや HDR スペースグレーディング作業を行うことができます。登録されたエフェクトは、組み込みのブルーム生成の後、最終コンポジットの前に、登録順に実行されます。これは Zig レベルの拡張ポイント(起動時に1回登録)であり、ライブ/エディター作成のシェーダーシステムではありません。
ブルームにはクランプされていない HDR 輝度データが必要なため、ポストプロセッシングには上記の HDR メインパスが必要です——ソフトウェアレンダラーでは使用できません。