縮小バッファに描いたものを合成するというフローによって様々な制限がかかるのだ.
Lost Planet
西川善司の3Dゲームファンのための「ロスト プラネット」グラフィックス講座
- シーンカラーとシーンデプスの縮小版生成, 縮小解像度のアルファバッファも生成
- パーティクル群を縮小バッファへ描画,この時縮小アルファには最終合成時用のマスクを書き込む
- 縮小アルファを元にフル解像度シーンカラーへ合成
半透明の奥側は縮小シーンであるため, フル解像度との合成で解像度のズレが見える.
加算合成等の場合は縮小アルファにどのような値を書き込むのかわからない.
縮小アルファへの書き込みさえなんとかなれば加算減算乗算も可能に思える.
METAL GEAR SOLID 4
- 専用のRGBAバッファ(ブレンドバッファと呼称)を生成(縮小解像度も可)
- ブレンドバッファを(0,0,0,1)でクリア
- パーティクル群を書き込み
- アルファブレンド時
- RGB : Dst*(1-SrcAlpha) + Src*SrcAlpha
- Alpha: DstAlpha * (1 - SrcAlpha)
- 加算合成時
- RGB : Dst + Src*SrcAlpha
- Alpha: DstAlpha
- アルファブレンド時
- ブレンドバッファをフル解像度シーンに合成
- RGB : Dst * SrcAlpha + Src
Src*SrcAlpha の部分をシェーダ側で計算すれば乗算済アルファとして考えられる.
シーンとの合成がフル解像度なのでLost Plantの方法で問題であった半透明部の透過解像度の齟齬が無い.
アルファブレンドと加算合成(減算)の両方に自然に対応 (乗算は不可.
パーティクル描画と最終合成を分離しても大丈夫なのか不安だったので計算してみた.
c0, a0が(0,0,0,1)でクリア直後のブレンドバッファとRGB, Alphaとして, 3回のパーティクル描画をした場合を考える.
ここで c1, c2, c3 はアルファを乗算済のRGBとする.
最初の式はシーンバッファに直接描画した場合, 2つ目の式はブレンドバッファを利用した場合.
直感的には本当に同じ結果になるのか確信が持てなかったが式で一致が確認できたのでヨシ.
cs=c3+(c2+(c1+c0(1-a1))(1-a2))(1-a3)
— なが (@nagakagachi) 2021年12月9日
as=(1-a0)(1-a1)(1-a2)(1-a3)
c0=0, a0=1とすると
cs_=c3+(c2+c1(1-a2))(1-a3)
as_=(1-a1)(1-a2)(1-a3)
cdへの合成
c=cd*as_+cs_
=cd(1-a1)(1-a2)(1-a3)+( c3+(c2+c1(1-a2))(1-a3) )
=c3+(c2+(c1+cd(1-a1))(1-a2))(1-a3)
で最初の式でc0=cdとした場合と一致
Tales of ARISE
CEDEC2019: 『Tales of ARISE』におけるレンダリング技術と高速化
UE4改造して複数解像度による多段階の半透明描画をしている
- 低解像度で半透明描画 (MGS4と同様で, 縮小シーンではなさそう?)
- 低解像度バッファの勾配情報等から低解像度高周波マスク生成
- シーンへの低解像度バッファ合成と, フル解像度高周波ステンシルバッファ生成
- ステンシル出力有効にして高周波マスク値からステンシル値出力している?
- ステンシルバッファを利用してフル解像度で部分的に半透明再描画
- 詳細部分のみパーティクル描画をフル解像度で実行する
低解像度で描画して, 詳細が必要な部分だけステンシルマスク利用のフル解像度描画.
資料の情報からはMGS4ブレンドバッファと同様にシーンの縮小バッファではなくクリアされた縮小バッファに描いている?.
ブレンドバッファ方式の場合は乗算等は不可能そうに思えるがどうか?
earlydepthstencilでピクセル処理を早期棄却しつつ部分的にフル解像度描画できる.
高周波判定する閾値を変化させることで負荷のコントロールができそうな点も面白そう.