2013-04-09 15 views
5

DirectXの定数バッファを理解するのに苦労しています。私は一定のバッファがスロット(ゼロに割り当てる必要があることを理解http://msdn.microsoft.com/en-gb/library/windows/desktop/bb509581(v=vs.85).aspxshader constant-buffersの使い方は?

に説明するよう2つの構文

float4 myVar; 
シェーダファイルのトップレベルで宣言

cbuffer myBuffer 
{ 
    float4 myVar; 
} 

を見てきましたベースのインデックス作成)、コードで設定することができます。

私が見てきた2つのフレームワーク(SlimDXとSharpDX)は、SlimDXを文字列名(Shader reflection?)で、SharpDXをスロット番号で設定しています。から得られる?

2つのシンタックスが実際に異なる場合、.fxファイル内の宣言にどのようにスロット番号が割り当てられ、どのようにスロット番号がシェーダ間で共有されるのかについては、誰でも明らかにすることができますか?

すべてのヘルプは、あなたが参照しているドキュメントは、純粋なD3DシェーダモデルAPIのある

答えて

10

Raw Direct3D10/Direct3D11 API(Direct3D10.Device.XXX.SetConstantBuffersおよびDirect3D11.DeviceContext.XXX.SetConstantBuffersを使用)を使用する場合、SharpDXとSlimDXは同じ規則を使用します。

MSDNドキュメンテーションのセクション「デフォルトの定数バッファ」の節で述べたように、Constant Buffer内で定義されていない変数は、デフォルトのグローバル定数バッファ "$ Global"で終了すると説明されています。

一方、レガシーエフェクトフレームワーク(RAW Direct3D10 + APIと相互作用する)は、個々の変数に名前でアクセスします。内部的にはShaderReflectionを使用して定数バッファの内容を照会し、これらの定数バッファの割り当て/更新/アップロードを自動的に処理します。最後に、これはGPUにアップロードされる定数バッファであり、(定数バッファの外には存在しない)個々の変数ではありません。レガシーエフェクトフレームワークは、ShaderReflectionを使用してバインディングスロットを照会することによって、定数バッファをバインドするスロットを動的に処理します。

スロット番号は、コンパイル時にコンパイラによって割り当てられます。明示的にレジスタを指定しない場合(MSDNのドキュメントでcbufferのレジスタを参照)、コンパイラは使用される最初のcbufferへの最初の使用可能なスロットに影響します。明示的にレジスタを設定しない限り、コンパイラが同じ定数バッファのシェーダ間で同じスロットに影響を与えるという保証はありません。

+0

ありがとうございます - それがOKなら1つのフォローアップ - あなたはここで効果フレームワークが遺産であると言います - それは効果も11も避けなければならないのでしょうか? http://msdn.microsoft.com/en-us/library/windows/desktop/ff476136(v=vs.85).aspx(http://blogs.msdn.com/b)に記載されているのを見ることができません。 /chuckw/archive/2012/10/24/effects-for-direct3d-11-update.aspxには、主にEffects 10からの移植が容易になるように用意されていることが記載されています。その使用を一切スキップすることを推奨していますか? – AnonDev

+2

Effects11/Effects/FXファイルは廃止されており、もはやMicrosoftによって維持されていません(そのため、Effects11全体は古いDirectX June 2010 SDKまたはブログ記事からのみアクセス可能です)。したがって、Direct3Dの次の機能をサポートするために、これらの機能を改善することはありません。また、Windows RTアプリケーションから使用することもできません。 – xoofx

0

を高く評価しました。それぞれのミドルウェア(SlimDXまたはSharpDX)を調べて、シンタックスと基礎となるマッピングとの対応を理解する必要があります。

私は、サードパーティーのディストリビューションが独自の構文を完全に自由に定義できることを主張します(それは過度に複雑な方法で実装することができますが)。詳細はバージョンごとに異なる可能性があるため、マッピングを理解するには、各サードパーティベンダの対応するドキュメントを参照する必要があります。ソースコードが利用可能であれば、それを調べて自分自身でマッピングを理解することができます。いくつかのフレームワークの "ブラックボックス"の性質を考えると、単にフレームワークのドキュメントを受け入れることが期待されるかもしれません。この場合、標準/ベースライブラリのドキュメントを参照するのは間違いまたは抽象化のリークです。

最終的な質問は次のとおりです。実装/マッピングはなぜ気にしますか?これらの図書館全体のポイントは、便利な方法で詳細を抽象化することです。個人的に、なぜこれがイライラしているのか分かります(特に、プラットフォームの代わりに正式なドキュメントに頼っている場合は特にそうです)が、あなたが支払う関連コストは、コアを使用する代わりにそのようなプラットフォームを選択することの結果/トレードオフですライブラリを直接。

+0

おかげで、私は離れて一定のバッファがスロットを持っているハードウェアモデルから、彼らは抽象的とは思いません。 2つの構文とhow-slots-are-numberedの質問はラッパーに依存しないと私は思いますか? – AnonDev

+0

ええ、それはあなたの質問が実際にコアライブラリ対ラッパーライブラリの問題を提起するようだ。ラッパー・ライブラリーを選んだ結果、問題のドメインに必ずしも束縛されていないか、固有ではない一般的な問題がたくさんあります。それが助けになるなら、それは私がこれから近づいている方向です。参照しているフレームワークに十分な文書がないというのは本当の問題ですか? –

+0

私はそうは思わない - 彼らはDirectXの周りの薄いラッパーである - バッファスロットの概念はDirectXの概念であり、ラッパーライブラリの概念ではない。私は信じていますが、これはドキュメントです(または私はドキュメントを見つけることができません)。 – AnonDev

1

最初の構文:

float4 myVar; 

は、第二ストレートHLSLであるとして、Microsoftの効果構文、です。エフェクトシンタックスは、あなたのために定数バッファを自動的に割り当てることで物事を単純化しますが、これは柔軟性を犠牲にしています。

あなたがそうのようにスロット1に一定のバッファを割り当てますSharpDXを使用する:

cbuffer myBuffer: register(b1) 
{ 
    float4 myVar; 
}