P-MAPブレンド技法
自己紹介
宮部寿保 ナツメアタリ株式会社 名古屋事業所
平成元年入社 プログラマ
コンシューマゲーム開発一筋、20本以上のアクションゲームタイトル
を開発。
代表作「SFC ワイルドガンズ」「PS 北斗の拳世紀末救世主伝説」最
新作「PS4 ゴジラVS」ではグラフィック周り全般のプログラムと
ワークフローの構築を担当。
アジェンダ
• 事前乗算アルファおさらい
• ブレンドバッファおさらい
• P-MAPシェーダデモ
• P-MAPテクスチャデモ
• PS3ゴジラでのポストエフェクト最適化事例
• まとめ
事前乗算アルファおさらい
• 事前乗算アルファおさらい
• ブレンドバッファおさらい
• P-MAPシェーダデモ
• P-MAPテクスチャデモ
• PS3ゴジラでのポストエフェクト最適化事例
• まとめ
事前乗算アルファおさらい
プリマルチプライド(事前乗算)アルファ
 映像業界
 CG業界
 XNA
 Unityの一部のシェーダ Particle/Alpha Blended Premultiply
 DXT2・DXT4
検索事前乗算アルファ
ストレート・事前乗算
ストレートアルファテクスチャ 事前乗算アルファテクスチャ
A
RGB RGB
A
ストレートアルファを使ったブレンド
SrcRGB*SrcA+DstRGB*(1-SrcA)
SrcRGB
DstRGB
SrcA
1-SrcA
事前乗算アルファを使ったブレンド
SrcRGB*SrcA+DstRGB*(1-SrcA)
事前にRGBにアルファを乗算
しておく
SrcRGB
DstRGB 1-SrcA
ブレンドバッファおさらい
• 事前乗算アルファおさらい
• ブレンドバッファおさらい
• P-MAPシェーダ
• P-MAPテクスチャ
• PS3ゴジラでのポストエフェクト最適化事例
• まとめ
ブレンドバッファ
■CEDEC2008
“ 「METAL GEAR SOLID 4」に使われた技術等の紹介”
の中で紹介されている今回の考え方のベース技術。
検索ブレンドバッファ
通常の半透明描画
ブレンドバッファを使った描画
アルファ合成と加算合成を解像度
の違う別のフレームバッファ(ブ
レンドバッファ)に合成しておき
、あとで拡大合成
描画順も問題なし
ブレンドバッファを使った描画
アルファ合成と加算合成を解像度
の違う別のフレームバッファ(ブ
レンドバッファ)に合成しておき
、あとで拡大合成
描画順も問題なし
加算とアルファ合成を
一度に描画している!
SrcRGB+DstRGB*SrcA
事前乗算アルファ合成
SrcRGB + DstRGB * (1 - SrcA)
加算合成
SrcRGB + DstRGB
アルファ合成
SrcRGB * SrcA + DstRGB * (1 - SrcA)
事前乗算アルファは加算も
事前乗算アルファ合成
SrcRGB + DstRGB * (1 - SrcA)
加算合成
SrcRGB + DstRGB
SrcAが0ならば加算と同じ!
事前乗算アルファは加算も
事前乗算アルファ合成
SrcRGB + DstRGB * (1 - SrcA)
アルファ合成
SrcRGB * SrcA + DstRGB * (1 - SrcA)
直前にSrcRGB*SrcAしておけば
アルファ合成と同じ!
事前乗算アルファは加算も
事前乗算アルファ合成
SrcRGB + DstRGB * (1 - SrcA)
加算合成
SrcRGB + DstRGB
アルファ合成
SrcRGB * SrcA + DstRGB * (1 - SrcA)
事前乗算アルファは加算も
どちらの機能も
持つ!
P-MAPとは
今まで
アルファ: SrcRGB*SrcA + DstRGB*(1- SrcA)
加算: SrcRGB*SrcA + DstRGB*1
のようにブレンディング係数を使い分けてました。
これを事前乗算用の式にまとめ、ROPユニット以前に行う計算によっ
てアルファ合成と加算合成を区別せず扱う考え方、
これを「P-MAP」(事前乗算アルファプラス)と呼ぶことにします。
今回のテーマ
「P-MAPシェーダ」
– 「ブレンドバッファ」の合成をシェーダ内で行う。
「P-MAPテクスチャ」
– 「ブレンドバッファ」そのものを事前にテクスチャ
化しておく
P-MAPを使った2つのテクニック
P-MAPシェーダ
• 事前乗算アルファおさらい
• ブレンドバッファおさらい
• P-MAPシェーダ
• P-MAPテクスチャ
• PS3ゴジラでのポストエフェクト最適化事例
• まとめ
DEMO1
加算・アルファ合成両方を含むマルチテクスチャシェーダの例
このデモでは1枚のメッシュを使い4枚のストレートアルファ画像をマルチテクスチャで描画しています。
1.別々にスクロールする2枚の紫の霧
2.星(加算)
3.煙
星(加算)はフレームバッファに対して加算を行うため一般的にはブレンド係数を変えて複数回描画を行
う必要がありますが、 P-MAPを取り入れたシェーダを作れば一度の描画で済ませる事ができます。
※ 描画面積の多いカードゲーム等の表現力向上、ポストエフェクトの描画速度の改善といった場面で役に
立つと思います。
DEMO2
加算合成とアルファ合成、どちらの表現もできる汎用シェーダのデモ
3つ並んだ同じ素材パーティクルは左から順に、
•赤く変調した加算合成 (背景が明るい場所で白飛びしています)
•赤く変調したアルファ合成 (どこでも綺麗赤く見えますが眩しさがあまり感じられません)
•赤く変調したアルファ合成の後、白く加算合成 (中央に白い芯があり、背景が明るくても白飛びしない)
これらは一般的にはブレンド係数を変えて描画することが多いですが、全て同じシェーダで描画できてい
ます。
各マテリアルの"Alp Color(RGBA)"と"Add Color(RGB)"を調整することで複雑な合成が行えます。
※ このようなシェーダがあれば加算とアルファ合成のためにシェーダーを使い分ける必要が無くなります
。
※ 一番右のようなパーティクルを表示しようとすると従来2パス以上かかりますが1パスで複雑な絵が出せ
るようになります。
※ 色違いエフェクト素材を用意する必要が減ります。
※ ストレート画像をそのまま利用できます。
• 事前乗算アルファおさらい
• ブレンドバッファおさらい
• P-MAPシェーダ
• P-MAPテクスチャ
• PS3ゴジラでのポストエフェクト最適化事例
• まとめ
P-MAPテクスチャ
DEMO3
加算・アルファ合成が混在した複数のテクスチャをPMAP_Makerを
使い、 一枚のP-MAPテクスチャにまとめておいてから表示しています
左に表示されているキャラクターは何枚もテクスチャを用意して複数回描画するのが一般的ですが、 実際
には一枚の事前乗算アルファテクスチャを一度で描画できています。
中央のパーティクルでは、爆発パターンの前半に加算のブルームが合成されています。
※ 従来2パス以上かかっていた描画が1パスで出来るようになりました。
※ αムービもこの手法で事前合成すれば加算を含めたムービーが作れます。
DEMO4
P-MAPテクスチャを使ってシーン内のドローコールを減らすデモ
Demo4>Demo4_Straight.unity
こちらが今までの一般的なストレート画像を使ったシーンです。
シーン内で100枚のスプライトが表示されていますが、 加算とアルファ用のマテリアルが混在するため50
回近いドローコールが発生しています。
Demo4>Demo4_PMAP.unity
Demo3と仕組みは同じですがP-MAPテクスチャを使えばテクスチャ領域毎に加算・アルファ合成を指定で
きますので シーン内のマテリアルが一つになり1度のドローコールにまとまりました。 実際にはDemo3よ
りもこのような用途で使われることのほうが多いと思います。
ポストエフェクト最適化事例
• 事前乗算アルファおさらい
• ブレンドバッファおさらい
• P-MAPシェーダ
• P-MAPテクスチャ
• PS3ゴジラでのポストエフェクト最適化事例
• まとめ
1 ブルーム成分を抽出、ガウスぼかしx3
640x360
320x180
160x90
80x45
2ブルーム成分を合成
320x180
320x180
160x90
80x45
3 最終合成
ブルーム:320x180
メイン:1280x720
最終:1280x720
フレア:256x256 レンズ周辺光256x256ノイズ:256x256
最適化1 1/4サイズでもっと合成できた
320x180
320x180
160x90
80x45
フレア:256x256 レンズ周辺光256x256
工程2:0.04ms > 0.05ms
工程3:1.18ms > 0.95ms
トータル:1.24ms > 1.0ms
(0.24msお得意 20%高速化)
最適化2 メインのテクスチャ入力が不要だった
最終:1280x720
ノイズ:256x256
ブルーム+フレア+周辺光:320x180
メイン:1280x720
工程3: 0.95ms > 0.87ms
最適化1・2トータル:1.24ms > 0.92ms
(0.32ms 25%高速化)
1280x720のフレームバッファが不要になった!
まとめ
• 事前乗算アルファおさらい
• ブレンドバッファおさらい
• P-MAPシェーダ
• P-MAPテクスチャ
• PS3ゴジラでのポストエフェクト最適化事例
• まとめ
まとめ
P-MAPシェーダ
– ストレートテクスチャ素材がそのまま使える
– 加算・アルファ合成が混在する複数のテクスチャを1Passで描
画
– 加算・アルファシェーダといった使い分けがなくなる
– 複雑な表現が可能
– シェーダを用意する必要がある
まとめ
P-MAPテクスチャ
– 事前乗算アルファテクスチャを使えば加算の要素も事前にコス
ト0で合成できる
– 加算用のテクスチャ容量を削減できる
– すでにある描画システムに加算とアルファ合成を混在させられ
る。
– マテリアルが一つになりドローコール削減
– シェーダを持たないプラットフォームでも使える
– 一般的なツールでのプレビュー・修正が難しい
まとめ
LUTテクスチャに応用
– 加算が混在したLUT
頂点色に応用
– 途中から加算になっていく3Dモデル
ムービーへの応用
– アルファムービーに応用すればムービ容量削減
– 複雑なマスクを作る必要が減る
補足
 「P-MAPシェーダ」「P-MAPテクスチャ」はどちらも出
力直前までは浮動少数で合成されるため、 普通に何度も
整数フレームバッファに描画した場合より精度の向上が
期待できます。
 「P-MAPテクスチャ」をリニアワークフローに対応する
には工夫が必要になってくると考えられます。
• 今回使用したプロジェクトファイル
https://github.com/ToshiyasuMiyabe/P-MAP
• 内容へのご質問、お問い合せなどはこちら
miyabe@natsumeatari.co.jp
2015/12まで
ご清聴ありがとうございました

CEDEC2015「加算合成コストが0になる!?すぐに使えるP-MAPブレンドテクニック」発表スライド