Slide 1 - Microsoft

Download Report

Transcript Slide 1 - Microsoft

DirectX グラフィックス
David Blythe (Architect)
Kev Gee (Software Design Engineer)
Windows® Graphics & Gaming Technology
Microsoft Corporation
Agenda
DirectX 9.0 SDK ステータス
Microsoft High Level Shader Language
(HLSL)
プリシェーダ
標準アノテーション&セマンティックを使った
コンテンツ作成
DirectX 9.0 SDK ステータス
DirectX 9.0c ランタイム
Shader Model 3.0 の微調整 + HLSL サポート
ジオメトリ インスタンス化
セントロイド修飾子
バグ修正
DirectX 9.0 SDK ステータス
SDK Update (Summer 2004)
HLSL のシェーダ 3.0 サポート
エフェクト フレームワークの改善
PRT + 球面調和の改善
ドキュメントの更新
DirectX 9 シェーダ モデル 3.0
DirectX 9.0 Direct3D の仕様どおり
2002年12月に DirectX 9.0 と共に出荷
2004年以降に出荷する 3D ハードウェア用に
設計
より多くの命令と柔軟性が可能に
HLSL にとって、より効率的なターゲット
vs_3_0 頂点シェーダ モデル
入力レジスタ
v#
一時レジスタ
r#
浮動小数点定数 c[i]
整数定数
ブール定数
アドレス レジスタ a0
ループ レジスタ aL
テクスチャ サンプラ s#
命令数
vs_2_0
16
12
256
16
16
1
1
0
256
vs_3_0
16
32
256
16
16
1
1
4
512
vs_3_0 シェーダ機能
頂点用のテクスチャ サンプリング!
4 ステージのテクスチャ入力が読み込み可能
texldl は src0.w として LOD が必要
ディスプレースメント マッピング、汎用的に使うた
めの配列/テーブルが可能に
SinCos はユーザー定義の定数を使わない
動的フロー制御
ifc, breakc, breakp
新しい vs_3_0 の応用
より効率的な HLSL 向けのターゲット
フロー制御のためコードサイズが削減
より良い命令キャッシュの振る舞い
ディスプレースメント マッピング
頂点テクスチャ ロード能力が基に
ジオメトリ インスタンス
ジオメトリ インスタンス
バッファ内ステップするとき、修正/分割を使って
DrawPrim 長を改善
頂点バッファ
インスタンス単位のマテリアル
12345678 …
2 三角形/インスタンス
インデックス 1/6 レートで
バッファ
インスタンス単位の座標変換
ステップ
12345678 …
ps_3_0 ピクセル シェーダ
ps_2_0
2+8
12
ps_3_0
10
32
16
32
0
0
4
1
224
16
16
4
1
入力レジスタ
一時レジスタ
テクスチャ サンプラ
16
浮動小数点定数 c[i]
整数定数
ブール定数
出力色
oC#
出力深度
oDepth
ps_3_0 機能
プレディケーションと if/then/else をベースと
した動的フロー制御
頂点シェーダとまったく同じ
完全に任意の入力入れ替え
Sincos はユーザー定義定数を使わない
勾配命令
dsx, dsy, texldd
セントロイド サンプリング
Agenda
DirectX 9.0 SDK ステータス
Microsoft High Level Shader Language
(HLSL)
プリシェーダ
標準アノテーション & セマンティックを使った
コンテンツの作成
Microsoft High Level
Shader Language (HLSL)
ピクセル シェーダ プロファイラ
頂点シェーダ プロファイラ
ピクセル シェーダ プロファイラ
ps_2_0
ps_2_a
ps_2_b
ps_3_0
Ps_2_0 プロファイラ
制限
12 一時レジスタ
8 テクスチャ座標 / 2 色
16 サンプラ (テクスチャ)
32 テクスチャ参照
64 算術命令
最大 4 の従属テクスチャ参照
入れ替えの制限
分岐なし
セントロイド サポート (caps ビット)
Ps_2_a プロファイル
制限
22 レジスタ
512 命令 (テクスチャ & 算術)
8 テクスチャ座標 / 2 色
分岐なし
DSX/DSY 命令
任意の入れ替え
従属テクスチャ読み込みの制限なし
セントロイド サポート (caps ビット)
Ps_2_b プロファイル (新規)
制限
32 レジスタ
8 テクスチャ座標 / 2 色
512 命令 (テクスチャ & 算術)
分岐なし
セントロイド サポート (caps ビット)
Ps_3_0 (新規)
制限
512 命令 (最低限)
32 レジスタ
10 属性イタレータ (テクスチャ座標/色/etc)
DSX/DSY サポート
分岐サポート
vFace と vPos サポート
セントロイド サポート
vFace
vFace によって、両面ライティングが可能に
vFace が正なら
三角形は視点を向いている
負なら
三角形は視点の逆側を向いている
注: vFace が使えるのは CMP と分岐命令のみ
HLSL では vFace をセマンティック “vFace” で指定
任意の式の中で使え、[-1,1] の値にマップされる
vFace の例
float4 main(
float vFace : VFACE,
float4 FrontColor : COLOR0,
float4 BackColor : COLOR1): COLOR0
{
return (vFace > 0) ? FrontColor : BackColor;
}
vFace アセンブリ
ps_3_0
dcl vFace
dcl_color v1
dcl_color1 v2
mov r0, v2
cmp oC0, -vFace.x, r0, v1
vPos
スクリーン座標が入る
x と y だけが有効
“vPos” セマンティックでアクセス
float4 PS (float2 vPos : VPOS) : COLOR0
{
return tex2D(Background,
vPos * NormalizationConstant);
}
vs_3_0 における VS/PS の結合
vs_3_0 内で定義したレジスタに書き込むではなく
o# レジスタに書き込む
使った o# をそれぞれセマンティックで指定
VS/PS の混合と一致は、頂点バッファと頂点ストリーム
の一致と同じように可能
ほとんどのセマンティックは o# について有効
特殊な意味を持つものがある
PSIZE, POSITION0, POSITIONT…
バージョンを混在させてはならない (???)
セントロイド
テクスチャ座標の補間方法の修正、3頂点テクスチャ
座標で指定したテクスチャの領域内に必ずテクス
チャ座標が来るようにする
主に使うのは、複数テクスチャのパックや、マルチサ
ンプル アンチエイリアス (MSAA) を有効にしたとき
MSAA を使うと、アクセスした頂点が指定した三角形の
外にあるテクスチャ座標に容易になってしまう
セントロイドの例
セントロイドは入力上の修飾子
セマンティック上の修飾子
Float4 PS(
float2 Tex: TEXCOORD0_CENTROID)
{
return tex2D(s, Tex);
}
セントロイド 対 非セントロイド
差分命令
ps_2_a と ps_3_0 でサポート
ロックステップで4 ピクセルを実行して計算し
た個別の差分
シェーダ内の任意の値で計算できる
手動でテクスチャ サンプリングを計算する際
に役立つ
dsx/dsy 命令によりアクセス
TexDD
テクスチャの勾配を提供
TexDD は勾配を事前計算し、後で参照するメソッド
dsx/dsy と共に使い、フロー制御内部でテクスチャ
参照を行う
勾配はフロー制御内では計算できない
勾配を計算する命令を含む
texld と他の基本 tex 命令
頂点シェーダ プロファイル
VS_2_0
VS_2_a
VS_3_0
VS_2_0 プロファイル
制限
12 一時レジスタ
静的分岐 / 静的ループのサポート
固定レジスタへの出力
256 命令
VS_2_a プロファイル
制限
13 一時レジスタ
動的分岐 / 動的ループ
固定レジスタへの出力
256 命令
VS_3_0 プロファイル
制限
32 一時レジスタ
動的ループ
decl によるレジスタへの出力
テクスチャ サンプリングのサポート
512 命令 (最低限)
VS からのテクスチャ参照
VS_3_0 に texldl サポートを追加
指定した LOD でテクスチャ参照
4つの読み込みサンプラ
次のような用途:
ディスプレースメント マッピング
テクスチャにレンダリングした後で VS 内で使用
フェイス アニメーション
その他多く
参照なしの場合に比べ、かなり遅くなる場合がある
頂点テクスチャ参照
sampler s;
float4 main(
float4 Tex: TEXCOORD0): POSITION0
{
// LOD を .w に格納
return tex2Dlod(s, Tex);
}
頂点テクスチャ参照
vs_3_0
dcl_texcoord v0
dcl_2d s0
dcl_position o0
texldl o0, v0, s0
2.0 対 3.0
ピクセル シェーダ 3.0
caps を持つ 2.0 と大きくは違わない
優れた最低限のスペック 対 caps
入力レジスタの追加 (vFace,vPos)
ループと分岐
完全な 32 ビット浮動小数点
頂点シェーダ 3.0
より多くの一時レジスタ
テクスチャ参照 !!
フロー制御
分岐サポート
静的
動的
インライン
ループ サポート
静的
“動的”
実際には動的ではなく、break_p を使った静的
展開 (アンロール)
静的フロー制御
命令分岐が bool 変数を基にしているとき
使用
横のトークンにあるコードを実行するだけ
ハードウェアによっては負荷なし、そうでないも
のもある
vs_2_0 と vs_2_a プロファイルで使用
動的フロー制御
命令分岐が実行時の値を基にしているとき
使用
コードのスキップが小さければ、ヒューリス
ティックを使って動的分岐を回避
横のトークンにあるコードを実行するだけ
vs_2_a プロファイルで使用
インライン フロー制御
プロファイル ターゲットが要求したフロー制御をサ
ポートしないとき使用
if ブロックのほうが、if の両側を実行するより負荷
が高いときも使用
if と else の両方を実行
この負荷が高いか低いかの条件に依存
全てのプロファイルで使用
インライン フロー制御の例
if (Value > 0)
Position = Value1;
else
Position = Value2;
// Value > 0 を基に線形補間を計算
mov r1.w, c2.x
slt r0.w, c3.x, r1.w
// Value1 と Value2 間を線形補間
mov r7, -c1
add r2, r7, c0
mad oPos, r0.w, r2, c1
静的ループ
int LoopCount を使ってループ反復を制限
するとき使用
全種類のループで動作:
for, while, do while
一般に最も簡単に構文経由で使える
実行命令数の削減に効果的な場合がある
ハードウェアによっては負荷なし、
そうでないものもある
vs_2_0 と vs_2_a プロファイルで使用
動的ループ
現在のシェーダモデルで、動的ループは明示的に
は提供されない
しかし、break 命令と組み合わせた静的ループを使って
それを実装
ループ数が実行時に決まるとき使用
ヒューリスティックを使って、ループを展開すべきか
どうかを決定
vs_2_a プロファイルで使用
展開ループ
プロファイル ターゲットが要求したフロー制御をサ
ポートしないとき使用
反復回数が事前に分かっていれば、通常これは最
も速いループ手法
反復回数が分かっていれば、任意の終了条件を持
つループでも展開できる
全てのプロファイルで使用
フロー制御のパフォーマンス
静的&動的フロー制御を使うと、劇的に
シェーダが遅くなる場合がある
ハードウェアによっては、静的フロー制御は
非常に負荷が低いが、そうでないものもある
正しく使えば、シェーダ切り替えの数とそれ
に関連した CPU のオーバーヘッドを劇的に
削減できる
つまりハードウェアによっては、変数終了条
件を持つ展開ループが、静的ループよりかな
り高速になる場合がある
Agenda
DirectX 9.0 SDK ステータス
Microsoft High Level Shader Language
(HLSL)
プリシェーダ
標準アノテーション&セマンティックを使った
コンテンツ作成
プリシェーダとは何か ?
プリシェーダは、ピクセル シェーダや頂点
シェーダから抽出した、実行時に一定の
コード
たとえば
mWorldView = mul(mWorld, mView)
プリシェーダの例
float4 main(float4 vDiffuse : COLOR0) :
COLOR0
{
return MaterialEmissive
+ MaterialAmbient *
WorldAmbient
+ MaterialDiffuse *
LightDiffuse * vDiffuse ;
}
// ピクセル シェーダでは一般的ではないが、
// 頂点シェーダ内で同様のコードが見られる
生成したコード
//プリシェーダ
mul r0, c3, c4
add c1, r0, c2
mul c0, c0, c1
// 3 命令
ps_2_0
dcl v0
mov r0, c0
mad r0, r0, v0, c1
mov oC0, r0
// 3 命令
// プリシェーダなし
ps_2_0
dcl v0
mov r0, c3
mov r1, c4
mad r1, r0, r1, c2
mov r0, c0
mul r0, r0, c1
mad r0, r0, v0, r1
mov oC0, r0
// 7 命令
なぜ ?
生成した定数をすべて検出するのは困難
エフェクト開発時にパフォーマンスを改善
入力変数の最終セットが決定する以前に、
動作の仕方はプリシェーダに依存する
エフェクト ファイルへのインターフェイスを
単純化
worldview のケースでは、全てのエフェクトが
ベース行列をとることができ、実行時のオー
バーヘッドほとんどなしで必要な行列を生成でき
る
利用可能にするには ?
デフォルトでプリシェーダは利用可能
エフェクト内でコンパイルしたシェーダは全てラン
タイムコードとプリシェーダ コードの両方を生成
実行時定数を生成する必要があるとき、エフェク
トはプリシェーダ コードを実行
エフェクト コンパイル フラグで無効にできる
D3DXSHADER_NO_PRESHADER
その他の使い方
たとえプリシェーダを使わなくても、fxc.exe
を使ってプリシェーダが生成したコードを見
ると、どの定数を実際に消費するはずかが
分かる
HLSL をスタンドアロンで使う際にも、
コンパイラ ツールとして役に立つ
// エフェクト ファイル全ての逆アセンブル
fxc –T fx_2_0 in.fx
Agenda
DirectX 9.0 SDK ステータス
Microsoft High Level Shader Language
(HLSL)
プリシェーダ
標準アノテーション&セマンティックを使った
コンテンツ作成
プレビュー パイプラインの概要
メッシュ
DCC アプリケーション
エフェクト
プレビュー
パイプライン
ライブラリ
FX ファイル
X ファイル
ビューア
なぜこれを作ったのか ?
標準アノテーション&セマンティックによって、
共通の用語でシェーダを共有できるようにな
る
共通のフォーマットや用語なしでは、1つのアプリ
ケーションでしか使えない
他人の書いたシェーダが理解しやすくなる
より単純な方法で、シェーダと一緒に動作する
ツールが書ける
設計目標
エフェクト ファイルは HLSL がアート パイプ
ラインと共に動作するようにするための文法
なので、
人間に読める
ツールやプロジェクト間で交換可能
シェーダと共に動作するサードパーティのツール
が可能に
標準アノテーション&セマンティック
アプリケーションに結びついた共通用語で、DCC ツール
内で HLSL を使えるようにする
アノテーションとは何か ?
エフェクト ファイル内で HLSL オブジェクトへ
のコンテキストを提供するメタデータ
Technique
Parameter
Pass
セマンティックとは何か ?
データと HLSL 変数との関係を指定
アプリケーションから HLSL パラメータへの
データの対応を定義
さらに、アノテーションでデータのコンテキスト
を指定する場合もある
スクリプト
将来 ???
エフェクト ファイルにプログラミング処理論理
の手法を提供するアノテーション
ループ
描画 (ジオメトリ、バッファ)
レンダー ターゲット
シェーダ ネットワーク
ワークフローの例
シェーダ
作成
ツール
シェーダ
編集
ツール
コンテンツ
作成
ツール
ゲーム
エンジン
プレビュー パイプラインとは何か?
デジタル コンテンツ作成 (DCC) ツールに
Microsoft HLSL パラメータ編集を統合
オブジェクト上で HLSL のリアルタイム ビュー
アノテーション FX 変数用の自動 UI
標準 X ファイル フォーマットのエクスポート
コンテンツ パイプラインと共に働くことを可能に
する拡張可能なライブラリ
業界のサポート
3D Studio Max (Discreet)
FX Composer (NVidia)
RenderMonkey (ATI)
RT/Shade (RT/Zen)
ShaderWorks (MadFx)
XSI (Softimage)
これは氷山の一角に過ぎない
サンプル アノテーション
UI
UIName, UIWidget, UIMin, UIMax
テクスチャ
ResourceType, Dimensions, Function
グローバル
Author, Company, Copyright, Version
汎用
Space, Units
サンプル セマンティック
マテリアル
Diffuse#, Specular#, Ambient#
ジョイント
Joint, JointInverse, JointWorld
行列
World, WorldInverse, WorldInverseTranspose,
WorldView, View, ViewInverse
境界
BoundingCenter, BoundingSphereSize,
BoundingBoxSize
時間
Time, LastTime, ElapsedTime
サンプル
Float4 Kd : Diffuse
{
String
String
Float4
Float4
String
UIName = “Diffuse Color”;
UIWidget = “color”;
UIMin = (0.0, 0.0, 0.0, 0.0);
UIMax = (1.0, 1.0, 1.0, 1.0);
UIHelp = “This is the diffuse color”;
} = (0.3, 0.2, 0.4, 1.0);
UI レビュー
UIName
ツール UI 内に表示する変数の名前
UIHelp
その変数をどう使うかを説明するために、
ユーザーに表示する説明文
UIMax, UIMin
その変数の最大値と最小値
UI レビュー - continued
UIWidget
その変数をどのエントリ値に使うかを示す UI
ヴィジェットの種類
可能な値
None – その項目を表示しない
Slider
Spinner
Color
Grayscale
Numeric
String
Texture
Direction
まとめ
標準セマンティックは、HLSL シェーダを以下
のもの全体で共有する方法
プロジェクト
人々
ツール
デザイン プロセス内でのアート生成をより簡
単にする
エンジンがデータ作成からはじめる必要はない
お願いしたいこと
私たちのレビュー リストを取り寄せてください
[email protected] にメールしてください
標準アノテーション&セマンティックと共に
HLSL を使ってください
ここで、ご意見をお聞かせください
ご質問は ?
お知らせ
SDK & 日本語ドキュメント送付申し込み
出口の箱に名刺を入れてください
DirectX Graphics Meeting (9/8)
開発者の方と WGF の仕様などに対する
フィードバックを個別に1時間づつ議論
講演終了後、川西にお問い合わせください