高度なライティング & DirectX グラフィックスの将来展望

Download Report

Transcript 高度なライティング & DirectX グラフィックスの将来展望

高度なライティング

& 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; //

出力

:

ディフューズ色

7

定数

x1.r = dot(cAr,vNormal); x1.g = dot(cAg,vNormal); 11 vs_1_1

命令 グレースケールのライトなら

x1.b = dot(cAb,vNormal);

もっと少ない

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 MS IHV

Application GDI+ Direct3D

ユーザー 空間

Application GDI+ Direct3D U-M Driver Win32K DXG Kernel Display Driver Videoport Miniport

セッション 空間 カーネル 空間

Win32K CDD DispLdr 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.