660 likes | 921 Views
DirectX Graphics 9 Overview. Dave Aronson Program Manger DirectX Graphics Microsoft Corporation. 概要. 高次サーフェスの更新 ディスプレースメント マッピング 頂点シェーダ 2.0 ピクセル シェーダ 2.0 インフラストラクチャ 将来的な計画. API の更新. DXG9 は新しい .dll DX8 インターフェイスは以前の dll に渡された API トークン名が *8 から *9 に変更された
E N D
DirectX Graphics 9 Overview Dave AronsonProgram Manger DirectX Graphics Microsoft Corporation
概要 高次サーフェスの更新 ディスプレースメント マッピング 頂点シェーダ 2.0 ピクセル シェーダ 2.0 インフラストラクチャ 将来的な計画
API の更新 • DXG9 は新しい .dll • DX8 インターフェイスは以前の dll に渡された • API トークン名が *8 から *9 に変更された • すべてのオブジェクト ハンドルがインターフェイスに変換されて Released() が可能 • TSS が分割され、サンプラとテクスチャの座標/パラメータ反復子を処理する • シェーダ使用時に引き続き適用可能なレンダリング ステートを明示する
シザー面 • ピクセルをクリップするために設定できるデバイスあたり 1 つの矩形 • すべてのハードウェアでサポートされる • 生産性向上アプリケーションで有用 • API 能力および有効フラグ • Devcaps->Scissor • D3DRS_SCISSORENABLE
四角形 • 高次プリミティブとして返すことが可能 • 共有頂点パッチ スキーム、および/または • Catmull-Clark サブディビジョン サーフェス • 実装では平面のケースに対して 2 つの三重を使用できる • GL スタイルの色呼び出しを使用 : • 四角形の最後の頂点が平面シェード カラーを設定 • DXG9 では高優先事項ではない
フォグ • 引き続きサポートされる外部シェーダ • レンダリング ステートによって制御される FF パイプラインにおいて • 古いアプリケーションは依然としてこの動作に依存 • 多くの比較的新しいアプリケーションでは、代わりにシェーダ コードを使用して実装する • DX10 ではシェーダに移行する可能性がある
重要性が下がった機能 • W バッファリング • 高精度ピクセル操作では重要性が少ない • 単に z 深度を使用するよりも低速な場合がある • カラー キー • テクスチャからカットされる可能性が高い • ビデオ パスでのキー処理をサポートする可能性がある
HO プリミティブの概要 • フロート型テセレーション レベルのサポート拡張 • LOD のスムーズなバリエーションが可能 • レーショナル サーフェスのサポート • 適応テセレーション • ディスプレースメント マッピング • 2 つの方法
レーショナル サーフェス • サーフェス モデルの品質を改善 • コンテンツに必要なプリミティブの数を削減 • ほとんどの最新ハードウェアで有効 • API サポート • D3DRS_RATIONALSURFACE • Devcaps->RationalSurface • N パッチおよび RT パッチに影響
適応テセレーション • スクリーン空間エッジ ベースの基準 • 共有エッジのクラックを回避 • RT パッチおよび N パッチの両方でサポートされる • API が指定する内容 : • スクリーン空間における望ましいエッジ長 • 結果のセグメント カウントの最小/最大制限
ディスプレースメント マッピング • テセレートした頂点に対する摂動として実装される • ピクセル単位ではまだ実行できない • ディスプレースメントは頂点シェーダの特殊レジスタ • 頂点シェーダ宣言によって定義される • FF パイプライン内にある場合 • "法線によってスケーリングされ、位置に追加される"
D マッピングの方法 • 2 種類の能力がサポートされている : • 1. 事前計算ディスプレースメント マッピング • オブジェクトに適す • 2. サンプリング ディスプレースメント マッピング • 地形に適す
1. 事前計算 D マッピング • すべてのプリミティブが同じレベルにテセレートされると想定 • ディスプレースメントはテッセレータによって生成される位置で事前に計算される • 順序指定はハードウェア固有 • ディスプレースメントは追加の "非同期"頂点ストリームとして提供される • ディスプレースメントは頂点シェーダで読み取り専用レジスタとして使用可能
事前計算 D マップの API • ディスプレースメント値を生成する API ルーチンが用意されている • 構文に関する提案事項 : • 結果ベクトルは頂点シェーダの入力ストリーム コンポーネントとして設定する • または、頂点シェーダの "テクスチャ"として設定することも可能
事前計算 D マップの問題 • メリット • 事前計算により実行時間が高速に • キャラクタおよびコンパクト オブジェクトに有用 • 制限 • 適応テセレーションでは機能しない • => 地形ほどは適さないかもしれない • ディスプレースメント マップをアニメーションできない • スクロールするにも再生成が必要 • プロシージャルは同様に D マップに変換
2. サンプリング D マッピング • レンダリング時に D マップをフィルタリング/サンプリングする • 入力サーフェスは頂点アクセスのために特殊テクスチャとして指定される • エバリュエータはトリリニアを使用してサンプリングする • 特殊レジスタ内のスカラー結果を頂点シェーダに対して利用可能にする • 依存読み取りに対するサポートはなし • つまり、サンプリング前に u/v 値のシェーダ変更はない
サンプリング D マップの問題 • メリット • 適応テセレーションで使用できる • したがって地形に対して比較的高速 • オブジェクトの自動 LOD を提供 • 制限 • つなぎ目にまたがるディスプレースメント マップについてはクラックを避けるために注意が必要 • 実装では操作の順序を保証しなければならない
D マップの使用方法 - シナリオ A • ディスプレースメントが存在するという前提で法線マップをエンコードする • ベース メッシュ法線のみからライティング基準を計算する • すべてのライティングをピクセル単位で行う • D マップは遮蔽効果のみを提供する • 遠いフィールドでは簡単に省略できる • D マップと N マップのデータ同期が必要 - 個別にタイル化できない
D マップの使用方法 - シナリオ B • テセレーション後のポリゴン単位でピクセル ライティング基準を計算する • ピクセル単位または頂点単位のライティングと共に使用する • ディスプレースメント マップに法線ディスプレースメントも含まれている必要がある
DMAP データ形式 • 32 ビット浮動小数点ピクセル形式が理想的 • ほかの形式もサポートされる • 16 ビット フロート • 16 ビットおよび 8 ビット符号付き整数 • 2 種類のチャネル カウントがサポートされる • 1 チャネル形式、ディスプレースメント専用 • 4 チャネル形式、法線 + ディスプレースメント用
頂点シェーダの更新 • DirectX8 からは最小限の変更 • 命令および定数の数が倍になる • 双方とも 256 に設定される • 新しい数学操作はなし • フロー制御のサポートを追加
Vs.2.0 モデル • 4D アドレス レジスタ a0 w-o 1 • 16 頂点入力 v# r-o 1 • 16 テンポラリ レジスタ r# r/w 3 • 256 定数 c# r-o 1* • 256 命令 • * 1 つの命令で同じ定数を 2 回使用するのは OK
頂点シェーダのフロー制御 • DX9 のシェーダはフロー制御を定数のみに基づいてサポートする • 現在の問題を解決するように設計された • 環境マッピングなどの有効化/無効化 • "変化するライト数"の問題 • その他の点では、シェーダは回帰と固定機能 DX7 スタイルの能力との比較
命令カウントとスロット数 • フロー制御とはスロット != 命令数を意味する • 命令ストアは 256 だが、保存されているよりも多くの命令を実行可能 • 実際の命令数上限はもっと高い
頂点シェーダのジャンプ • 構文 : jump condition, label • 説明 : • conditionは定数レジスタで評価される • labelはこの命令の命令ダウンストリーム
頂点シェーダのループ • 構文 : loop condition, label • 説明 : • conditionは定数レジスタで評価される • labelはこの命令の命令ダウンストリーム • 自動インクリメント カウンタによる定数配列バンクのインデックス付け
頂点シェーダのサブルーチン • 構文 : jsr condition, label • 説明 : • conditionは定数レジスタで評価される • labelは命令 • Ret ステートメントはルーチンの終わりを表す • 1 つの命令スロットを使用する
頂点フローの規則 • ループの内側にジャンプが出現してもよい • ループの内側でサブルーチンを呼び出すことができる • サブルーチンにジャンプとループが含まれていてもかまわない • ジャンプはループに入ることも、ループから出ることもできない • サブルーチンはネストできない
頂点シェーダの宣言 • 構文が更新されて、宣言と実行が切り離される • シェーダ本体を再コンパイルすることなく、宣言で VB 入力の再定義が可能 • 例 :宣言のハンドルを独立させる • さらに多くの正射影機能セットもサポートする予定
頂点入力形式 • 正射影のタイプ : • 1D、2D、3D、4D float • 2D、4D short/word • 11-11-10 法線用 • BYTE4 0xWWZZYYXX • D3DCOLOR 0xWWXXYYZZ • 未指定の要素に以下を埋め込む • x,y,z,w = {0,0,0,1}
正射影データ マッピング • 以上すべてをサポート : • 符号付き、および符号なし • 2 の補数、2 の補数でない • 正規化、非正規化 • 正規化された符号付き値は [-1.0 to 1.0]
ピクセル シェーディングの概要 • 2 レベルのシェーダ プログラミング • 高水準言語 • アセンブリ言語 • 両方とも D3DX に実装される • DX8.1 と同様
アセンブリ言語 ps.2.0 • より "直接的な"制御が可能 • ハードウェアの詳細を公開 • レジスタ カウント • 命令カウント • .cpp マクロ能力をサポート予定 • 高水準言語への、つまりファイルへの埋め込みが可能
構文に関する注意 • 現時点の構文は最終的なものではない • 現時点の構文は論理モデルを表すことを目的としている • 構文に関するフィードバックを歓迎する
ps.2.0 モデル • 4D ベクトル レジスタ : • 2 色反復子 v# r-o 1 • 8 テクスチャ座標反復子 t# r/w 2 • 16 テクスチャ/サンプラ s# r-o 1 • 16 テンポラリ レジスタ r# r/w 3 • 32 定数レジスタ c# r-o 2 • 任意に混在させることが可能な命令 : • 32 アドレス操作 • 64 数学操作
ps.2.0 サンプル シェーダ ps.2.0 dcl v0.rgba; // ディフューズ色 dcl t0.rg; // oT0 より dcl s0.a, 1D; // スカラー テクスチャ dcl s1.rgb, 2D; dcl s2.rgb, 3D, bx2;// 符号付きへの変換 dcl s3.rgb, cube; texld r0, s1, t0; // 1D テクスチャをサンプル mul r1, r0, v0; // ディフューズを変換 out r1; // 出力
レジスタ宣言 • 反復子とサンプラは使用前に宣言しなければならない • レジスタ v#、t#、s# • テンポラリ レジスタ r# が可能 • コメントを記述する機会を提供する • シェーダに割り当てられた使用可能なリソースを識別する • 使用を少なくすればパフォーマンスに貢献
宣言命令 dcl regname.components • このシェーダが使用する必要のあるコンポーネントを識別する • 使用するコンポーネントを指定しなければならない • 宣言内ではデフォルトは使えない • 1D、2D、3D とキューブ マップを識別する • その他すべての状態は TSS で
イニシャライザ命令 (def) def c#, { val, val, val, val } • 単なるイニシャライザ • 宣言ではない • 後続の SetShaderConstant() 呼び出しによってオーバーライドが可能
アドレス命令 • texld r#, s#, t/r# • ステージ s# の座標 t# または r# でサンプリングした値を r# にロードする • サンプリング アドレスとして r# を使用すると依存読み取りを指示することになり、t# は非依存
アドレス命令2 • texldp r#, s#, t/r# • ステージ s# の座標 t# または r# でサンプリングした値 (サンプリング直前に w で除算したもの) を r# にロードする • サンプリング アドレスとして r# を使用すると依存読み取りを指示することになり、t# は非依存 • 射影テクスチャに使用する
アドレス命令3 • texkill t/r# • t または r レジスタ入力のいずれかでも機能する • いずれかの入力コンポーネントが <=0 のとき、ピクセルを削除 • DX8 と同様 • >= と = のフラグが必要 • ほとんどの FSAA スキームで解決できない不自然な効果のエイリアシングを導入する
出力命令 out r# • レジスタに最終的な色を格納することを指示する • レジスタ r# は再利用不可 zout r# • レジスタに最終的な z バッファ値を格納することを指示する • レジスタ r#
数学命令 • パラレル操作 : • add、sub、mul、mad、frc、cmp • ベクトル操作 : • dp3、dp4 • スカラー操作 : • rcp、rsq、exp2、log2、pow • ロジック操作 : • min、max、sge、slt
可能性のあるマクロ命令 • DX8 のピクセル シェーダより : • lrp、cnd • DX8 の頂点シェーダより : • m4x4、m3x3、dst、lit • 一般的な要求 : • norm、cross、abs、sincos
入力引数修飾子 • すべての入力を否定する • 入力に対する任意の入れ換え/複製 • r0.xyzw r2.rgba r0.a • 補数または bias/_bx2 修飾子はない
符号なしテクスチャに関する注意 • [-1..1] の範囲の符号なしのフォーマットを符号付きデータとしてロードする _bx2 の機能は引き続き使用可能 • DX6/7/8 のコンテンツ用に必要 • サンプラ ステージ宣言で、または TextureStageState 内で指定する
出力修飾子 • 出力に対する任意マスク • r0.y • _sat は frc と同様に引き続き必要 • 範囲 0..1 に固定 • シフトはサポートされない • _d2、_d4、_x2 など
ほかの問題 • なし
依存読み取り • 継続して処理できるが、最大深度 4 まで : dcl t0.xy; dcl s0.rg, 2D; ld r0, s0, t0; ld r1, s1, r0; ld r2, s1, r1; ld r3, s1, r2; これは有効