Appearance
第11回 品質とパフォーマンス
前回: 第10回 レイトレースの原理
今回の授業内容
- GPU 処理時間を基準にシェーダーの負荷を比較する
- ステップ数、サンプル数、分岐、テクスチャー参照の影響を分ける
halfとfloatの使い分けを確認する- 内部解像度を下げてフルスクリーン処理を軽量化する
- 低、中、高の品質プリセットを設計する
必ず計測してから改善する
コードが長いことと GPU 負荷が高いことは同じではありません。実際に何回実行されるか、画面の何ピクセルを処理するか、メモリから何回値を読むかが影響します。
比較時は、カメラ、解像度、シーン、実行時間をそろえ、一度に1つの設定だけを変えます。
負荷の内訳を切り分ける
| 項目 | 主な影響 | 軽減方法 |
|---|---|---|
| レイマーチのステップ | MapScene の反復 | 最大距離、バウンディング、早期終了 |
| ボリュームのサンプル | 密度とノイズの反復 | 大きな歩幅、Alphaによる早期終了 |
| ソフトシャドウ | 追加のレイマーチ | ステップ削減、距離制限 |
| フルスクリーン | 全ピクセルで実行 | 内部解像度を下げる |
| 半透明 | Overdraw | 画面占有を減らす、表示順を調整 |
可視化を計測に使う
レイマーチの反復回数を色で表示すると、どの場所に計算が集中しているか分かります。
hlsl
float ratio = (float)steps / (float)MAX_STEPS;
float3 heatmap = lerp(float3(0.0, 0.2, 1.0), float3(1.0, 0.0, 0.0), ratio);距離場の表面付近や、細かい形状の間で反復が増えることを確認します。
精度と解像度
half は色や正規化後の値に適する場合があります。一方、ワールド座標、長距離の累積、SDF の表面判定は誤差の影響が大きいため float を使います。
フルスクリーン効果はピクセル数に応じて負荷が増えます。半分の幅と高さで描画すると、ピクセル数は約4分の1になります。アップスケール時のぼけや輪郭とトレードオフです。
実習:同じシーンで計測する
- 第07回のボリュームまたは第09回の水面を選ぶ
- Profiler で CPU と GPU のフレーム時間を確認する
- Frame Debugger で描画順とパスを確認する
- ステップ数を変えて、複数フレームの安定値を記録する
- 影、AO、追加ノイズを1つずつ無効化する
- 内部解像度または Render Scale を変える
- 見た目と GPU 時間を表にまとめる
授業内課題:品質プリセットを作る
| 項目 | 低 | 中 | 高 |
|---|---|---|---|
| ステップ数 | |||
| 影ステップ | |||
| ノイズ Octaves | |||
| 内部解像度 | |||
| GPU時間 |
低品質でも表現の主要なシルエットと動きは残します。細かな影、追加ノイズ、内部解像度の順など、作品の意図に応じて何を削るか決めます。
完成条件
- 比較条件をそろえて GPU 時間を記録している
- 負荷の主要因を1つずつ無効化して切り分けている
- 低、中、高の品質プリセットがある
- 採用した値と、削った品質を説明できる
今回のまとめ
最適化は見た目を無条件に削る作業ではありません。表現の目的を残しながら、実際の計測でボトルネックを探し、品質と処理量の組み合わせを設計する作業です。
次回: 第12回 統合制作