Practical PRT

高度なライティング & DirectX
グラフィックスの将来展望
David Blythe (Architect)
Kev Gee (Software Design Engineer)
Windows® Graphics & Gaming
Microsoft Corporation
Agenda
高度なライティング テクニック
DirectX グラフィックスの将来展望
高度なライティング テクニック
ゲーム内でよりリアルなライティングを
達成する方法
優れたライティングは品質にとって重要
2つの異なるテクニック
D3DX を使ってそれぞれを容易に実装す
る方法
背景
基本概念
ライティング環境
光の伝播
テクニックが何を可能にするかを理解す
るために必要な概念
ライティング環境
ライティング環境は、オブジェクトを照らす
全ての光
平行光源や点光源だけではない
面光源や壁・空・離れたオブジェクト・自分自身か
ら反射した間接光
サーフェイス上の全ての点について、
RGB ライト値に満ちた半球が存在
ライティング環境
各点での入力光を全て計算する伝統的手法は
負荷が高い
半球全体での積分が必要
通常、低解像度ディフューズ キューブ マップで行う
か、単純なライティングを使った近似
本講演のテクニックは全ライティング環境を使用
正確な近似を使用
リアルタイム – ディフューズ キューブ マップより高
速
複数の平行光源より優れている
光の伝播
光の伝播とは、光がジオメトリやマテリアルと
どのように相互作用するか
グローバル イルミネーション
反射と色の放出
影
表面下散乱
動的なライティング環境をリアルタイムで計算す
ることは困難
静的ライティングについては、ライト マップが使える
ライティング図
入射放射輝度
(球状環境マップ)
出力放射輝度
伝播した
入射放射輝度
表面下散乱
ライティング環境
光の伝播
伝統的なライティング
SH 放射照度環境マップ
事前計算済み放射輝度伝播
議論するテクニック
球面調和 (SH: Spherical harmonic ) は
放射照度 (irradiance) 環境マップを表す
動的面光源だが、単純な光の伝播
事前計算済み放射輝度伝播
(PRT: Precomputed Radiance Transfer )
複雑な光の伝播を持つ動的面光源だが、
剛体オブジェクトのみ
SH 放射照度環境マップ
名前にビビることはない
放射照度とは単に「ある点に入ってくる全ての光」
を意味する
球面調和を知っている必要はない
ゴールは、オブジェクトの全ての点で
総入射光を見つけること
これを行う個別の方法
平行光を仮定し、N・L
ディフューズ キューブ マップを N でインデックス化
SH 放射照度環境マップ: cont.
このテクニックは光を球関数として扱う
球面調和 (SH) を使って、ディフューズ キューブ マップ
をチャンネルあたり 9つの係数で近似する
したがって、64x64x6 のディフューズ キューブ マップの
代替として、カラー ライティングがたった7つの float3
シェーダ定数となる
動的で複雑なライティング環境についてディフュー
ズ ライティングを計算する非常に高速な方法
ディフューズ ライティングについては、
近似誤差が数パーセントの正確さ
伝統的なライティングを使うと、シェーダは2つのラ
イト、5つのライトなどを扱う。このテクニックが意味
することは、シェーダの複雑さがライティングに依存
しなくなること
SH 放射照度環境マップ 対 PRT
次のテクニック PRT と違って
事前計算ステップをほとんど持たない
セルフ シャドウやグローバル イルミネーション
のような複雑な光の伝播はない
変形可能なオブジェクトを扱う
これと PRT を組み合わせるのは容易
どちらのテクニックも SH 係数内に
ライティング環境が必要
従って、いったん持てば、これでもPRTでも
オブジェクトを照明できる
SH 放射照度環境マップを行う方法
次のような D3DX 関数を使ってライティングを
SH 係数に近似:
D3DXSHProjectCubeMap
D3DXSHEvalConeLight
D3DXSHAdd, D3DXSHScale, D3DXSHRotate
SH 係数からシェーダ用の定数を計算
シェーダはその定数と法線を使って、
頂点 / ピクセルでのディフューズ色を計算する
詳細については SDK サンプルを参照
SH 放射照度環境マップ HLSL シェーダ
// 入力: 法線と 7 つの float4 定数
//
cAr, cAg, cAb, cBr, cBg, cBb, cC;
// 出力: ディフューズ色
x1.r = dot(cAr,vNormal);
x1.g = dot(cAg,vNormal);
x1.b = dot(cAb,vNormal);
7 定数
11 vs_1_1 命令
グレースケールのライトなら
もっと少ない
float4 vB = vNormal.xyzz * vNormal.yzzx;
x2.r = dot(cBr,vB);
x2.g = dot(cBg,vB);
x2.b = dot(cBb,vB);
float vC = vNormal.x*vNormal.x - vNormal.y*vNormal.y;
x3 = cC.rgb * vC;
float3 diffuseColor = x1 + x2 + x3;
複数の SH ライティング環境をブレンド
空間内の全点がディフューズライティング環境を持つ
暗い隅のライティングは大きな明るい部屋の真ん中とは異なる
全点でライティング環境を格納することは
現実的でない
従って、ある頻度でのみ
オブジェクトの移動に従って、
最も近いライティング環境間でブレンド
各サンプル点で生成するには、
キューブ マップをオフラインでレンダリングして、
D3DXSHProjectCubeMap で SH 係数を近似
不正確なブレンド
光源が本当に離れていないと、線形ブレンドは
不正確になる
光源
正確なライト方向
ライト方向
(近い壁からの間接光の場合もある)
オブジェクトの新しい位置
移動するオブジェクト
正しくない線形ブレンド結果
事前計算済み放射輝度伝播 (PRT)
動的ライティング環境と組み合わせた
複雑な光の伝播を可能に
伝統的なテクニックでは困難
伝統的なライト マップと違い、
光の伝播が動的なライティング変更に対応
ディフューズ マテリアルがベスト – 光沢も可能だ
が負荷が高い
シェーダ内での特殊な扱いなしで、
次のものを提供:
ソフト セルフ シャドウ
内部反射と色放出
表面下散乱
しかし、制限がある
PRT の実行方法
圧縮した PRT 伝播係数をメッシュ用に生成
ライティング環境に依存しない光の伝播を計算
頂点単位、あるいはテクセル データ単位で作成
実行は簡単 – D3DX を使うだけ (算術演算不要)
時間がかかる (秒単位) ので、アート作成中に行う
ライティング環境を球面調和 (SH) 係数に変換
リアルタイムでもオフラインでも実行可能
D3DX API 呼び出しを使う (算術演算なし)
先のテクニック (SH 放射照度環境マップ) と
同じアイデア
上の内容をシェーダ内で使って、
ディフューズ色を計算
DirectX SDK Update (Summer 2004) に
おける D3DX PRT API の更新
新しいモジュール型設計
より柔軟なシミュレータ
適応型メッシュ テセレーションを統合
3つのインターフェイス
PRT シミュレータ エンジン: ID3DXPRTEngine
PRT バッファ: ID3DXPRTBuffer
圧縮 PRT バッファ: ID3DXPRTCompBuffer
PRT のオフライン部分
ID3DXMesh を使った初期化エンジン
パラメータ設定
D3DXSHMATERIAL 配列
サンプリング情報
オプションのテクスチャ反射率
ループ、光の伝播をシミュレートする
Compute* を呼び出す
ID3DXPRTBuffer 内で累積合計
圧縮しシェーダ データを抽出
詳細については SDK サンプルを参照
PRT の実行時部分
D3DXSHEval*() を呼び出し、オブジェクト空
間のライティング環境を L’ として SH に変換
これをオフラインで行いシーン内に格納してもよ
い
CPU 上で定数データを計算
頂点単位あるいはテクセル単位で、
圧縮バッファからデータを格納
PRT HLSL シェーダ
float4 vAccumR = 0, vAccumG = 0, vAccumB = 0;
for (int i=0; i < (NUM_PCA/4); i++)
{
vAccumR += vPCAWeights[i] * aConsts[nOffset+1+(NUM_PCA/4)*0+i];
vAccumG += vPCAWeights[i] * aConsts[nOffset+1+(NUM_PCA/4)*1+i];
vAccumB += vPCAWeights[i] * aConsts[nOffset+1+(NUM_PCA/4)*2+i];
}
4 PCA の場合
float4 vDiffuse = aConsts[nOffset];
vDiffuse.r += dot(vAccumR,1);
vDiffuse.g += dot(vAccumG,1);
vDiffuse.b += dot(vAccumB,1);
11 vs_1_1 命令
NUM_CLUSTERS * 4 定数
頂点ごとに 1 float4 + 1 int
8 PCA の場合
14 vs_1_1 命令
NUM_CLUSTERS * 7 定数
頂点ごとに 2 float4 + 1 int
反射率の扱い
最初のオプションは、サーフェイスの反射率
(ディフューズ反射率) を PRT 信号に乗算す
ること
反射率が信号と同じ頻度なら、これは妥当
テクスチャを使って反射率を乗算
より高い頻度でテクスチャを格納
高い頻度のテクスチャは、
低い頻度のシェーディングの不具合を隠す
適応型メッシュ テセレーション
各頂点で光の伝播方法を計算するので、頂
点が十分にないと、頂点単位 PRT はうまく
見えない
これを解決するために、メッシュをテセレー
ションしてより多くの頂点を持つようにする
PRT シミュレータは統合されたメッシュ テセ
レーションを持ち、必要な領域に非均一に頂
点を追加できるよう援助する
詳細情報:
SDK 内のサンプル
SDK 内のプログラミング ガイド
Ravi Ramamoorthi と Pat Hanrahan による “An
Efficient Representation of Irradiance Environment
Maps” , SIGGRAPH 2001
Peter-Pike Sloan, Jan Kautz, John Synder による
“Precomputed Radiance Transfer for Real-Time
Rendering in Dynamic, Low-Frequency Lighting
Environments” , SIGGRAPH 2002
[email protected] にメールをください
Agenda
高度なライティング テクニック
DirectX グラフィックスの将来展望
DirectX グラフィックス将来展
望
我々はどこにいるのか ?
我々はどこに行く必要があるのか ?
我々はどうやってそこにたどり着くか ?
お願いしたいこと
我々はどこにいるのか ?
DirectX 9.0c がリリースされました !
SM 3.0 ハードウェアが利用可能に
命令数、差分、セントロイド、動的フロー制御、
入れ替え、インスタンス
エフェクト / HLSL 内の改善
ローカルな変形を持つ PRT
新しいサンプル フレームワーク
新しいツール – PIX、プレビュー パイプライン
XNA イニシアティブ
我々はどこにいるのか ?
良い
ポスト処理の時代
高ダイナミックレンジ (HDR) 画像
ぼかし、グレア、被写界深度…
優れたローカル ライティング (皆さんの役割)
Oren-Nayer, Cook-Torrance, …
グローバル (的) イルミネーション
影 (シャドウ ボリューム、深度マップ)
アンビエント遮蔽
事前計算済み放射輝度伝播 (PRT)
我々はどこにいるのか ?
悪い
タイトル開発に時間がかかりすぎる
シェーダ モデル 2 はあまりに多くのことが可能に !
どうやったらこのテクノロジを効率的に使えるのか ?
うわっ、俺の仕事はどこに ?
依然として、グラフィックス カードのバリエーション
が多すぎる
多数のカードをターゲットにすると時間がかかる
少数のカードをターゲットにするとお客が減る
どうやって液晶とモニターとTVの XYZ を駆使する
のか ?
歪像ピクセル、(非)正方形ピクセル
我々はどこにいるのか ?
ひどい
ドライバを更新したらタイトルが落ちた
この BSOD は何か ?
どのシェーダモデルをターゲットにすべきか
1.0, 1.1, 1.2, 1.3, 1.4,
2.0, 2.0a, 2.0b, 3.0?
我々はどこに行く必要があるのか?
有益なエコシステムを思い出してください
顧客が PC を購入するとき
グラフィックス ハードウェア、他のハードウェア的
要素と
OS を一緒に購入
これは、「ゲーム プラットフォーム」
顧客はエンターテインメントを希望
エンターテインメント == すぐに動作し、
説得力のある経験
エンターテインメント != どうして動かないかを
見つけること
我々はどこに行く必要があるのか ?
ISV はゲーム アプリケーションや
開発コンポーネントを提供
ゲームは定期的に説得力のある新しい経験と
共に現れる
IHV はグラフィックスを提供
新機能を持つ新しいハードウェア
Microsoft は OS を提供
新機能を持つ新しい OS
Microsoft はプラットフォームの定義を
コーディネートする
我々はどこに行く必要があるのか ?
ゲーム プラットフォームとしての Windows
安定性
セキュリティ
可用性
一貫性
テクノロジ
→ Windows Graphics Foundation
(閑話休題、命名について)
Windows Graphics Foundation == WGF
Direct3D API の新しい名前
リリースは WGF m.n{.o}
‘m’ は重要で新しいアーキテクチャ
DirectX7->DirectX8 を考えてください
~5 年のタイムフレーム
‘n’ は新機能 / 新 API
DirectX8.0->DirectX8.1->DirectX9 を考えてください
~1 年のタイムフレーム
‘o’ はサービス リリース
(本題に戻ります…)
安定性 & セキュリティ
全てのデスクトップ グラフィックスは
DirectX を使って動作
新しいドライバ モデル
Longhorn の大きな改善
ほとんどシームレスなエラー回復
グラフィックス ドライバからの BSOD はない
より多くの処理がユーザーモードに移行
カーネル処理の単純化
厳しいコンテキスト レベルのアクセス制御
providers
新しいドライバ モデル
ISV
Application
GDI+
Direct3D
Win32K
DXG
MS
IHV
Application
ユーザー
空間
セッション
空間
GDI+
Direct3D
U-M Driver
Win32K
CDD
Kernel Display Driver
DispLdr
Videoport
Miniport
カーネル
空間
DXGkrnl
K-M Driver
可用性
仮想化
GPU は複数のアプリで利用可能
GPU 処理のスケジューリング
Crawl: バッチをスケジュール
Walk: コンテキストをスケジュール
Run: プリエンプティブなコンテキスト
スケジューリング
仮想 GPU メモリ
Crawl: 事前読み込みが必要なサーフェイス
Walk: 要求に応じて読み込むサーフェイス
Run: 要求に応じたサーフェイスからの
ページング
一貫性
グラフィックス ハードウェアのバリエーション
を削減
すぐに始める、数年でメリットが明らかになる
より注意深く振る舞いを指定
2つの数をどうやって加えるか
三線形フィルタリングとは何か
マルチサンプル AA はどのように動作するのか
機能 CAPS を排除
パフォーマンスと “major caps” でスケール
Major cap == WGF version
テクノロジ
ステップ 0
不十分な部分を修正
安定性、セキュリティ、一貫性、パフォーマンス
不要な部分を取り除く
固定機能パイプライン部分
ステップ 1
プログラミング モデルの進化
より表現力豊かなプログラミング可能性
ステップ 2
アーキテクチャの進化
新しい種類のアルゴリズムを可能に
ステップ 0 に進む
不要な部分を取り除く
固定機能処理
頂点ライティング
フォグ
アルファ テスト
プリミティブ
三角形ファン
ポイント スプライト
フォーマット
FVF 頂点
レガシ テクスチャ / RT フォーマット
プログラミング モデルの進化
共通シェーダ コア
プログラマブル シェーダ ステージに使用
VS, PS, …
密接に特徴づけ (32-bit float)
共通シェーダ コアの特徴
整数命令セット
インデックス化した一時レジスタ
単純化と組織化
リソース
ステージからステージへの連携
プログラミング モデルの進化
上位レベルプログラミングの進化
将来は HLSL
アセンブリ言語はデバッグ用のみ
将来のプログラミング構成体
シェーダ間で共有するサブルーチン
エフェクト フレームワークの進化
さらに拡張
オーサリング アプリケーション
ランタイム アプリケーション
プリシェーダ、アノテーション…
アーキテクチャの進化
新しいパイプライン ステージ
ジオメトリ シェーダ (WGF 1.0)
ストリーム出力 (WGF 1.0)
テセレータ、ポスト テセレータ VS (WGF 1.0+)
効率性の改善
ステート管理
HDR 画像フォーマット
法線マップ圧縮
テクスチャ比較フィルタ
~パーセント近い
WGF レンダリング パイプライン
固定機能
プログラマブル
メモリ
入力
アセンブラ
頂点
シェーダ
テセレータ
VS
サンプラ
頂点
インデックス
テクスチャ
バッファ
バッファ
ジオメトリ
シェーダ
セットアップ ピクセル
ラスタライザ シェーダ
サンプラ ストリーム出力
メモリ
テクスチャ
ストリーム
バッファ
出力
合成
サンプラ
テクスチャ
深度
レンダー
ステンシル ターゲット
ジオメトリ シェーダ
プリミティブ単位で処理
隣接性を含む
トポロジ処理
輪郭エッジ
押し出し、止め継ぎ、べべル
データ増幅
点 → ジオメトリ
フィン、ファー
! テセレーション
プログラマブル セットアップ
平面式、重心座標パラメタの計算
「ジオメトリ シェーダはすばらしい」
- Peter-Pike Sloan
その他の改善
ストリーム出力
効率的な 「頂点バッファへのレンダリング」
配列化したリソース + ジオメトリ シェーダ
単一パスでキューブ マップにレンダリング
より多くのリソース
一時、サンプラ、定数、テクスチャ…
ステートの削減、組織化
より効率的なステート変更
バッチ オーバーヘッドの削減
10倍の改善がターゲット
タイムフレーム
Longhorn での新しいドライバ モデル
crawl, walk, run の順序
WGF 1.0 in Longhorn
どちらも 2005年 の Longhorn ベータで
次は ?
SDK の更新は続く (今年の末)
来年 WGF 1.1 実作業開始
1.0 リファレンス実装が先
警戒してください
鋭利なツール !
動的条件と SIMD 処理はうまく調和しない
ジオメトリ シェーダはテセレータではない
HW 設計はテクスチャ命令より ALU 命令の
ほうが頻繁だと仮定している
キャッシュ スラッシングも
共通場所での初期の深度処理
2パスに延びたシェーディング
予期せぬエッジ ケースが発生するかもしれない
我々はどちらを向いているのか ?
ジオメトリの複雑さ
輪郭エッジ
テクスチャのパラメータ化
変移 (ディスプレースメント)
スキニング & モーフィング
マテリアルの複雑さ
繰り返し応答
粗さ (ジオメトリの複雑さ ?)
表面下属性
光伝播の複雑さ
面光源
(セルフ) シャドウ
内部反射
WGF 1.0 の後
マルチサンプル AA & スーパーサンプル AA に
再取り組み
より一貫性のある望ましい振る舞い
倍精度浮動小数点
いずれ必要になる
高次サーフェイス
計算 >> メモリ バンド幅のとき
自動リソース管理
共有サブルーチンなど
プログラマブル ブレンディング
HLSL / エフェクトのアプリケーションとの統合
WGF 1.0 のさらに後
その他のテクノロジに目を向け続ける
レンダリング
レイトレーシング
フォトン マップ
ラジオシティ
ジオメトリ モデリング
物理
衝突
IK, 運動学, …
依然として進むべき長い道のり
Akeley 2003
36000倍のパフォーマンス改善が必要
フレームレート、大きなディスプレイ、AA、ステレオ、
FOV…
年間成長率 2.0倍 (複利) で約15年
トリックは効率性を失わずに改善を達成する
こと !
前向きに挑戦
汎用目的と特殊目的とのバランス
例えば、RISC 対 CISC
サンプラをシェーダ コードに移すべきか ?
メモリ アクセス
構造体の配列 対
配列の構造体
どうやって計算を構造化すべきか ?
汎用目的の CPU と同じではない !
前向きに挑戦
並列化を最大に
遅延隠蔽テクニックを使う
計算 >> メモリ バンド幅 と仮定する
コミュニケーションをどうやって構造化する ?
ステージ ↔ ステージ バッファリング
読み取り-修正-書き込みメモリ操作を探求
プログラミング モデルをどうやって表現する ?
革新を可能にするが、一貫性を保つ
まとめ
安定性
一貫性
セキュリティ
WGF
On
Longhorn
可用性
テクノロジ
お願いしたいこと
DirectX 9.0c にアップグレードしてください
シェーダ モデル 3.0 を検討してください
DirectX SDK Summer Update 2004
HLSL とエフェクトの改善
PRT
PIX、プレビュー パイプライン
標準セマンティック & アノテーション
新しいサンプル フレームワーク
ベータ プログラムに参加してください
パブリックとベータの DirectX ニュースグループ
教えてください
何が皆さんの障害になっているのか ?
機能のリクエスト
[email protected] にメールしてください
ご質問は ?
?
?
?
?
?
?
?
?
?
?
?
お知らせ
SDK & 日本語ドキュメント送付申し込み
出口の箱に名刺を入れてください
DirectX Graphics Meeting (9/8)
開発者の方と WGF の仕様などに対する
フィードバックを個別に1時間づつ議論
講演終了後、川西にお問い合わせください
© 2003-2004 Microsoft Corporation. All rights reserved.
This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.