問題タブ [direct3d11]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
603 参照

windows-7 - direct3d11.1 id3d11device1 は 11.1 の機能を使用できません (win7)

d3d11.1 デバイスとそのコンテキスト (ID3D11Device1、ID3D11DeviceContext1) が正常に作成されました。

ドキュメントに記載されている方法を使用して:

d3d11.1 オブジェクトは有効で機能していますが、d3d11.1 固有の機能を使用できません。そして、CheckFeatureLevel(D3D11_FEATURE_D3D11_OPTIONS)Returns all FALSE の構造。これft_levelD3D_FEATURE_LEVEL_11_0ID3D11Device1 からフェッチした後です。

私がここに欠けているものはありますか?AMD 5950 カード用の windows7 SP1 (プラットフォーム パッチ付き)、Windows 8.0 SDK、および Catalyst 13.9 ドライバーを使用しています。

0 投票する
1 に答える
268 参照

sharpdx - テクスチャのスロット番号を名前で取得するにはどうすればよいですか?

Direct3D 11 と SharpDX を使用して、シェーダーで宣言されているテクスチャ マップの名前を指定すると、Sampler と TextureView を割り当てるスロットをどのように知ることができますか?

ドキュメントには、ShaderReflection を使用できることが示されていますが、その方法は明確ではありません...

0 投票する
1 に答える
6860 参照

vertex-shader - この計算シェーダーが頂点シェーダーよりも遅いのはなぜですか?

ストリーム出力を使用する頂点シェーダーではなく、計算シェーダーを使用してボーン変形をメッシュ頂点に適用することを検討しています。コンピューティング シェーダーの実行が頂点シェーダーよりもはるかに遅いことがわかりましたが、書き留める前に、何か間違ったことをしていないことを確認したいと思います。

100,000 個の頂点と 300 個のボーンの 1,000 フレームのアニメーション データのテスト データを使用すると、頂点シェーダーは約 0.22 ミリ秒で実行され、計算シェーダーは 4 倍の 0.85 ミリ秒かかります。タイミングは、(CPU タイマーではなく) D3D API タイマー クエリを介して行われます。

変形構造体.hlsl

bone_deform_cs.hlsl

bone_deform_vs.hlsl

実行後のバッファの内容を比較すると、それらは同一であり、期待される値が含まれています。

計算シェーダーを間違って実行し、スレッドを生成しすぎているのではないでしょうか? 渡す番号がDispatch間違っていますか?これは 1 次元のデータ行であるため、 を使用するのが理にかなっています[numthreads(64,1,1)]。32 ~ 1024 のさまざまな値を試しました。64 は、AMD GPU を効率的に使用するために必要な最小値であるため、スイート スポットのようです。ともかく。を呼び出すとDispatch、実行するように要求し(vertex_count / 64) + (vertex_count % 64 != 0) ? 1 : 0ます。100,000 個の頂点の場合、呼び出しは になりDispatch(1563,1,1)ます。

これが頂点シェーダーの実行方法です。

それとも、シェーダー リソース ビューからの読み取りと順序付けされていないアクセス ビューへの書き込みは、頂点バッファーからの読み取りとストリーム出力バッファーへの書き込みよりもはるかに遅いというだけでしょうか?

0 投票する
1 に答える
881 参照

c# - SharpDX DataStream ベースのバッファの初期化が失敗する

学校の最終プロジェクトで使用するために、D3D11 を使用して非常に基本的なメッシュ レンダラーを作成しようとしています。私は、rastertek サイトや Frank De Luna の本のような基本的なオンライン チュートリアルに従い、想像できる最も単純なパススルー シェーダーを使用するなどしましたが、三角形を画面に表示することはできませんでした。最後に、VS 2013 のグラフィックス デバッグ機能について知り、頂点バッファーとインデックス バッファーがガベージ データでいっぱいになっていることを確認できました。コードを実行したい場合は、ここでソリューションをホストしましたが、D3D やその SharpDX C# ラッパーに精通している人が、次のコードで何が間違っているのか教えてもらえますか?

これは私のジオメトリ データです。Vertex 構造体には Vector4 の位置と色のフィールドがあり、Index は ushort のエイリアスです。

上記のデータで頂点とインデックス バッファーを初期化できないコードを次に示します。

ただし、上記のコードを次のコードに置き換えると、機能します。何が間違っているのかわかりません。

0 投票する
1 に答える
138 参照

windows-phone-8 - wp8 D3D11、割り込み時に、現在使用しているSRVを解放できません

テンプレート Direct3D と XAML を使用する winphone8 用のプロジェクトを作成します。win ボタンを押すと、割り込みのために OnNavigatedFrom が呼び出されます。ここで、すべての D3D11 ID3D11ShaderResourceView* を解放し、ゲームに戻ったときにそれらを再作成したいと考えています。SRV をリリースするたびにアプリのメモリのログを出力します。現在使用している SRV を除いて、SRV に対して Release() を呼び出すと、メモリが実際に解放されることがわかりました。だから、メモリが漏れています。この問題を解決するにはどうすればよいですか?

0 投票する
1 に答える
335 参照

direct3d - (D3D11) 別のスレッドでのテクセルの読み取り

D3D10 では、ステージング テクスチャを GPU メモリにロードし、CPU 上のテクセル データにアクセスするためにマップします。これは、私がレンダリングするスレッドではなく、別のスレッドで行われます。デバイスメソッドを呼び出すだけで動作します。

D3D11 ではステージング テクスチャを GPU にロードしますが、それにアクセスする (つまりマップする) には、デバイスではなくコンテキストを使用する必要があります。即時コンテキストは一度に 1 つのスレッドしか使用できないため、即時コンテキストは使用できません。しかし、遅延コンテキストを使用してテクスチャから CPU に読み取ることもできません。

「遅延コンテキストで Map を呼び出す場合は、D3D11_MAP_WRITE_DISCARD、D3D11_MAP_WRITE_NO_OVERWRITE、またはその両方のみを MapType パラメーターに渡すことができます。その他の D3D11_MAP 型の値は、遅延コンテキストではサポートされていません。」

http://msdn.microsoft.com/en-us/library/ff476457.aspx

さて、私は今何をすべきですか?テクスチャを使用して特定のデータ (たとえば高さマップ) を保存することは一般的であり、そのデータを有効にするには明らかにそのデータにアクセスできる必要があります。D3D11 を使用して別のスレッドでこれを行う方法はありませんか?

0 投票する
0 に答える
792 参照

directx - 頂点単位のデータをテクスチャにレンダリングする (Direct3D 11)

水面を表す三角形のストリップで単純な 2D グリッドを生成します。最初に生成された頂点の位置は [0,0] で、最後の頂点の位置は [1,1] です。私の水のシミュレーションでは、頂点の現在の位置をテクスチャに保存し、次のフレームでテクスチャからこれらの値をサンプリングして、水面の以前の状態を取得する必要があります。

ということで、頂点サイズのテクスチャを作成しました。たとえば、10x10 の頂点グリッドがある場合、10x10 ピクセル (1 つの頂点データに対して 1 ピクセル) のテクスチャを使用します。そして、このテクスチャをレンダー ターゲットとして設定し、すべての頂点データをレンダリングします。

これによると: MSDN Coordinate Systems、グリッド内の頂点の現在の位置を使用する場合 ([0;0] で左下、[1;1] で右上)、レンダリングされたテクスチャは次のようになります。

ここに画像の説明を入力

そのため、NDC に変換する必要があります。次のように頂点シェーダーに変換します。

[頂点.x * 2 - 1; 頂点.y * 2 - 1]

次の 3x3 グリッドを考えてみましょう。

ここに画像の説明を入力

これで、グリッドがテクスチャ全体のサイズに引き伸ばされました。テクスチャ座標は NDC とは異なり、(変換前の) グリッドの元の座標を使用して、テクスチャから値をサンプリングし、頂点の以前の値 (位置) を取得できるようです。

これが私の頂点/ピクセル シェーダー コードのサンプルです。

この頂点シェーダーは座標を変換し、それを SV_POSITION セマンティクス (ピクセル位置を記述) でピクセル シェーダーに送信します。

そして、定義されたピクセル位置 (SV_POSITION) で頂点シェーダーから値を保存するピクセル シェーダーを次に示します。

そして、ついに私の問題に取り掛かります!Visual Studio 2012 でグラフィック デバッガーを使用すると、レンダリングされたテクスチャとその値を確認できます。ピクセル位置 [0,1] (テクセル座標系) は値 [0,0] (RGBA 形式の場合、正確には [0,0,0,1]) であると予想されますが、最終ピクセルの値が 3 つの頂点間で補間され、指定された頂点の値が間違っています。

VS グラフィック デバッガーのスクリーンショット:

レンダリングされた 3x3 テクスチャ (テクセル座標系の [0;1] 位置):

ここに画像の説明を入力

頂点およびピクセル シェーダーからの値:

ここに画像の説明を入力

特定のピクセルの頂点シェーダーからテクスチャに正確な値をレンダリングする方法は? 私はコンピューター グラフィックスと Direct3D 11 にかなり慣れていないので、私の欠点を許してください。