問題タブ [slimdx]
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.
c# - DirectX (2D) でプリミティブをスプライトに正しくオーバーレイする方法
Direct3D9 でのスプライトとプリミティブのレンダリングに問題があります。スプライトを使用して単純な 2D ゲームを作成しようとしていますが、単純な四角形や線などを描画するにはプリミティブも必要であることがわかりました。問題はオーバーレイにあります。
を使用してプリミティブのみを描画するDevice.DrawUserPrimitives()と、すべて問題なく、プリミティブが正しくレンダリングされます。を使ってスプライトを描くだけならSprite.Draw()それもいい。ただし、スプライトとプリミティブの両方を描画したい場合、すべてのスプライトは自動的にプリミティブをオーバーレイするか、黒くします。
Z バッファを無効にしたり、スプライトのレンダリング中に Z バッファへの書き込みを無効にしたりしましたが、常に同じでした。Z位置を変更することでプリミティブをスプライトにオーバーレイすることができましたが、すべてのプリミティブは黒でした... :(
スプライトを描画する前後の両方でプリミティブをレンダリングしようとしたことに注意してください。役に立ちませんでした。
スプライトとプリミティブの描画のスニペットをいくつかここに投稿します (変数名は、C# と SlimDX について何も知らなくても、何を描画しているのかを理解できるように変更されています)。
...ここで、m_fan1Vector4 positionは、およびvertexDeclを含む構造体でint color、これらの頂点要素を宣言します。
ところで:
- 塗りつぶしモードをワイヤフレームに変更すると、プリミティブのワイヤフレームが正しく描画されます。
- プリミティブがスプライトをオーバーレイする場合、プリミティブはほぼ黒で、描画するスプライトが多いほどプリミティブは暗くなります。アルファと関係あるのかな?
- スプライトを描画するまで、すべてのプリミティブが正しくレンダリングされます。しかし、スプライトの描画を停止しても、アプリケーションをリセットするまで、プリミティブは暗い/黒のままです。
私のソース コードの他のスニペットが必要な場合は、ここに書き込んでください。これを更新します。
c# - SlimDX VertexDeclarationメモリリーク?-それを回避する方法は?
SlimDX/DirectXアプリケーションに問題があります。SlimDXを使用してループを作成しましたがMessagePump、アプリケーションで大量のメモリを使用する問題が発生しました。これは増加していました。私は自分のコードのどの部分がそれを実行しているかを見つけようとしていましたが、おそらくこれであることがわかりました。
コードのこの部分は一定のループ(MessagePump.Run())で実行されており、毎秒約2MB多くのメモリを消費します。
でのメモリリークを回避する方法はVertexDeclaration?SlimDXのVertexDeclarationのC++ソースコードに何か問題があるのではないでしょうか。VertexDeclarationまたは、ループの外側を定義する必要がありますか?そして、なぜガベージコレクターはそれを処理しないのですか?
そして、これに関連する同様の質問:ループ内で新しい変数を定義した場合、実際には1回しか使用しないのに、問題はありますか?たとえば、次のコード:
ループで実行されます。それは問題ですか?ループの外側で行列TとSを定義する必要がありますか、それともガベージコレクターがこれを処理しますか?私はいくつかのソースコードの例を調べてきましたが、多くのプログラマーがこれを行っていますが、ループで実行すると、ますます多くのメモリを使用しませんか?
scaling - Direct3D ビューポート イメージのスケーリングを防止する (SlimDX)
ウィンドウの SlimDX に Direct3D11 シーンをセットアップしました。レンダリングは別のスレッドで行われます。
サイズ変更されたコントロールに描画するときにレンダラーが画像を引き伸ばさないようにする方法はありますか? 試してみましModeDescription.Scaling = DisplayModeScaling.Centeredたが、効果がないようです。足りないものはありますか?
(私はすでにレンダー ターゲットのサイズを更新しています。私がこれを尋ねる理由は、コントロールのサイズを変更すると、レンダー ターゲットが新しいサイズで更新される前に、イメージが引き伸ばされて一瞬コントロールがいっぱいになるためです。これにより、次の結果が得られます。サイズを変更すると、ひどくちらつきます. レンダー ターゲットを少しだけ速くリセットできれば、ちらつきがなくなる可能性があります. 画像を拡大縮小せずに隅に置いておくと、最終的にはまったく拡大縮小されないため、まったく問題ありません. )
回避策 1: レンダー ターゲットをコントロール内に配置できます。ウィンドウのサイズが変更されると、最初にレンダリングを停止してからバッファを更新し、再びレンダリングを開始する特別なメソッドを使用して、コントロールのサイズのみを変更します。ただし、それは少しハックです。レンダリング サイクルが完了するのを待ってから、ブロックし、サイズを変更して、ブロックを解除する必要があります。
回避策 2:同様の回避策は、レンダリング ループを中断するのではなく、サイズ変更フラグを確認することです。レンダラーは、スケーリングせずに直接描画できる必要があります。これは、パフォーマンス的にはるかに受け入れられます。ただし、実際のサイズ変更を実行するには、UI スレッドへのブロッキング呼び出しを行う必要があります。
回避策 3 : コントロールのサイズをまったく変更するのではなく、最大サイズまで大きくすることができますが、(ウィンドウ内で) クリップされます。サイズ変更は必要ありませんが、オフスクリーン ピクセルを大量にレンダリングしても構わない場合を除き、上記の回避策と同様の方法でシザー四角形を維持する必要があります。20 ほどの余分な行と列のピクセルをレンダリングすると、ウィンドウのサイズが元のサイズに戻されたときにエッジにすぐにイメージが提供されるという好ましい効果があります。
理想的には、サイズ変更は UI スレッドから直接実行する必要があります (サイズ変更を遅らせたり、レンダー スレッドから UI スレッドに再入力したりしてはいけません)。これはレンダリング スレッドの責任ではなく、遅くなります。同様に、最大のパフォーマンスを得るには、バッファのサイズ変更をレンダー スレッドで実行する必要があります (待機/ブロック/サイズ変更/ブロック解除でだまされないように)。これが機能しない唯一の理由は、バッファーのサイズが変更される前にサイズ変更が行われると、レンダー スレッドがスケーリングされることです。
だから私の質問はまだ立っています:スケーリングせずにレンダリングする方法はありますか?
directx - SlimDX で HLSL 均一変数の値を設定するにはどうすればよいですか?
これに関するドキュメントを見つけることができませんでしたが、おそらく非常に簡単です。変数を更新する必要があるピクセル シェーダーがあります。私が近づいた唯一のものはConstantTableですが、それは私が使用しているものであるDirect3D11ではなく、Direct3D9の下にあります。
DirectX11 を SlimDX で使用する場合、シェーダーにある均一変数の値を設定するにはどうすればよいですか?
winforms - D3D10/11 および MDI ウィンドウを使用したパフォーマンス
私は、多くの(> 40)リアルタイム(30 fps)更新グラフを保持する可能性のあるMDIアプリに取り組んでいます。各グラフは、潜在的に 3D ジオメトリをレンダリングする必要があります。(各ウィンドウで) SlimDX を使用して各ウィンドウに Direct2D を使用しようとしましたが、16 個を超えるウィンドウを追加するとパフォーマンスが大幅に低下します。フィードバックが役立つ可能性のあるこれを経験した人はいますか?
- 私は現在、ドキュメントによるとウィンドウごとに1つのスワップチェーンを持つD3D10/11 APIを使用しています。D3D9 ドキュメントでは、プレゼンテーションを行う前にウィンドウを切り替えることができます。これは推奨される使用方法です。代わりに D3D9 に切り替えてみるべきですか? スワップチェーンの切り替えの問題でしょうか?
- スワップ チェーンの問題でない場合は、D2D をスキップして、独自の頂点バッファーを管理し、D3D を使用してレンダリングする方がよいでしょうか?
よろしく!
directx - Direct3Dで丸みのある線を描く
端が丸い ID3DXLine を使用して線を描画する方法はありますか? いくつかの線分から曲線を描画しようとしていますが、線分が接続されている空の領域を取得しています。ここでのパフォーマンスは不可欠です。
ありがとう!
D3D を使用して太い曲線を描画する他の高速な方法はありますか?
directx - 複数のレンダー ターゲットがデータを保存しない
シェーダー モデル 4 で DirectX 11 をターゲットにして、SlimDX を使用しています。頂点を処理し、データの 3 つのテクスチャを保存するピクセル シェーダー「preProc」があります。1 つはピクセルごとの法線用、もう 1 つはピクセルごとの位置データ用、もう 1 つは色と深度用です (色は RGB を使用し、深度はアルファ チャネルを使用します)。
その後、後処理シェーダーでこれらのテクスチャを使用して、スクリーン スペース アンビエント オクルージョンを実装しますが、最初のシェーダーにデータが保存されていないようです。
これが私のピクセルシェーダーです:
次の構造体を出力します。
入力用に次の構造体を受け取ります。
ただし、後処理シェーダーでは:
単純に水色の画面 (各フレームの開始時にレンダー ターゲットをリセットした色) を出力します。getCol は動作することがテストされており、1 つのレンダー ターゲットのみを処理する場合に renderTex マテリアルから色を返します。ピクセルシェーダーを変更して randomTex テクスチャ (コードが以前にファイルからロードしたもので、レンダー ターゲットではありません) をサンプリングするようにすると、すべてが正常にレンダリングされるので、後処理シェーダーではないと確信できます。
私のslimDXコードが失敗した場合、私は次のようにします:
テクスチャ、shaderresourvecviews、および rendertargetviews の作成:
複数のレンダー ターゲットへのレンダリング:
次に、postProcessing シェーダーを画面にレンダリングするときの関数:
編集:現在の実行の単一フレームの PIX 関数呼び出し出力を追加しました。
EDIT2: 私はいくつかの読書をしてきましたが、おそらく preProc パスの後、テクスチャをレンダリング ターゲットとして割り当て解除してから、テクスチャを ShaderResourceViews として postProcess シェーダーに渡す必要があります。context.OutputMerger.SetTargets() を呼び出すと、現在割り当てられているすべてのレンダー ターゲットの割り当てが解除され、関数のパラメーターで指定されたレンダー ターゲットのみが割り当てられると想定しました。そうでない場合 (そうであるかどうかはまだわかりません)、SlimDX でレンダー ターゲットの割り当てを解除するにはどうすればよいでしょうか?
EDIT3: ああ、このMSDN ページによると、OutputMerger.SetRenderTargets() を呼び出すと、「ppRenderTargetViews のレンダー ターゲットの数に関係なく、すべての境界付きレンダー ターゲットと深度ステンシル ターゲットがオーバーライドされます。」そのため、OutputMerger に画面にレンダリングするように指示すると、すべてのレンダー ターゲットの割り当てが自動的に解除されます。これで振り出しに戻ります。
directx - 以前に成功した PIX 呼び出しが IASetVertexBuffers() の再生エラー中に失敗した
しばらくコーディングしてきた SlimDX DirectX11 ゲームでシェーダーをデバッグしようとしています。コードは正常に実行され、問題なく実行されます (テクスチャを無視しているように見えますが)。実験を実行して PIX 内の単一フレームをキャプチャすると、正常に実行されますが、キャプチャした PIX の [レンダリング] タブまたは [メッシュ] タブにアクセスしようとすると、問題なく実行されます。フレーム 次のエラーが表示されます。
EID は、キャプチャしたフレーム (フレームは EID 108 で開始) の直前に発生するものであるため、どこで失敗しているのかわかりません。
フレームの完全なストリームを実行して、エラーが表示されるかどうかを確認することにしました。今回は便利なものを手に入れました。
そして、それを引き起こしたイベントログ:
出力ログにも何もありません。誰もこれに遭遇したことがありますか?もしそうなら、どのように修正しましたか?
c# - Accessing the data in a SlimDX Texture2D object
How do I access the data in a Texture2D object? Lots of XNA posts suggest using the function Texture2D.GetData but that appears to be missing in the SlimDX version of a Texture2D. I need to process my image to calculate overall luminance of the scene and don't want to be running 300 accesses in a pixel shader (i.e. 300 access * num_pixels per frame) when I could be doing it once per frame.
All I need to be able to do is access the colour (R32G32B32A32) of the texture.
Ah I reckon I've found it thanks to the SlimDX SDK. The Texture2D.ToStream() method sends the texture data to a memory stream, then I simply have to parse the bytes to get at my data. I'll submit this as an answer if it works for me.
directx - SlimDX/DirectX9/C# - テクスチャ内のピクセル データにアクセスする方法
これは、StackOverflow に関する初めての質問です。万歳! 仕事と個人的なプログラミングの謎の両方で、日常的に StackOverflow を使用していると正直に言えます。99.9% の確率で、実際にここでも必要な答えが見つかります。これは素晴らしいことです!
実際に機能するものが見つからないように見えるため、現在の問題は実際には少し困惑しました。私はすでに GameDev.net のいくつかの投稿を読み、ネット上で他のリソースを見つけましたが、それを整理することはできません。
私は XNA 用に書いた小さな 2D エンジンを SlimDX (現時点では DirectX9 のみ) に移植している最中です。 XNA を使用して 6 か月。基本的なレンダリング機能のほとんどを完了し、実際に XNA SpriteBatch を大量の追加機能で再作成することができました (XNA では本当に見逃していました)。
私が仕事に取り掛かろうとしている最後のことの 1 つは、特定のテクスチャからソース四角形を抽出し、それをタイリングに使用することです。理由: タイリングしないときは、UV をいじって表示したいソース (例: 0.3;0.3 から 0.5;0.5) を取得できますが、タイリングするときは UV をタイリングする必要があります (0;0 から 2;2は、画像を 2 回並べることを意味します)、したがって、カットアウト テクスチャが必要です。
長い話を短くするために、私は以下を使用しようとします:
さまざまなピクセルを試しましたが、すべて偽のデータを提供しているようです。たとえば、実際に現在のアバターを使用して、DataRectangle から取得したバッファーが画像内の実際のピクセルと一致するかどうかを確認しようとしましたが、うまくいきませんでした (フォーマットが正しいかどうかも確認しました)。
私は何を間違っていますか?それを行うより良い方法はありますか?または、私の UV ストーリーが間違っているので、タイルを張る前にソース長方形を切り取るよりもはるかに簡単に解決できますか?
お時間をいただきありがとうございます。
レナード・フォンテイン
更新 #1
実際には、バイト配列から次の変換を使用して、ピクセル データをビットマップにエクスポートすることができました。
したがって、データは私が思っていたほど偽物ではないようです。ただし、次の問題は、ソースの四角形で指定されたピクセルを取得し、それらを新しいテクスチャにコピーすることです。切り取ろうとしている画像は 150x150 ですが、何らかの理由で 256x256 の画像 (2 のべき乗) に引き伸ばされていますが、実際に 150x150 を超えるピクセルにアクセスしようとすると、OutOfBounds 例外がスローされます。また、実際に 256x256 の 2 つ目の空白のテクスチャを作成しようとすると、何を入れても真っ黒になってしまいます。
これが私の現在のコードです:
私の新しい (追加の) 質問は次のとおりです。アルファ チャネルを含む、あるテクスチャから別の小さなテクスチャにピクセルを移動するにはどうすればよいですか? 元のテクスチャが 150x150 の場合、SurfaceDescription が 256x256 を報告するのはなぜですか?