問題タブ [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# - C#SlimDXゲームUIに使用するもの
現在、C#/ SlimDXを使用して3Dゲームを開発しています(ターゲットはDirect3D 9です)。しばらくの間、適切なゲームUIツールキットを探していましたが、決心できませんでした。
ゲームUIはロールプレイングゲーム用であるため、かなり複雑になり、かなりの数のコントロール(テキストボックス、インベントリグリッド、リストボックス、選択ボックス、スクロール可能な領域など)が含まれます。
私は以前(まだC ++ / OpenGLを使用していたとき)GameSWFを見て、そのアイデアを非常に気に入りましたが、現在のゲームでは問題外です。
SlimDXで使用するための優れたGUIツールキットを知っている人はいますか?
両方で利用できる優れたIDEがあるので、これにWPF/Silverlightを使用することに特に興味があります。しかし、グーグルですばやく検索しても、これらの埋め込みに関する情報は見つかりませんでした。
.net - D3D パフォーマンスの比較、シェーダーとビルトイン シェーディング
D3D に組み込まれた実行中の 3D エンジンがあります (SlimDX 経由)。レンダリング パイプラインの中断を避けるために、同じマテリアルを持つ多くのオブジェクトをより大きなメッシュにまとめました (状態の切り替えを減らすため)。これはうまく機能し、私のニーズに適したパフォーマンスレベルを提供します.
私が直面している問題は、実行時に、これらの大きなバッチ メッシュのサブセットのマテリアル プロパティを変更する必要があることです。そのために属性バッファを使用していますが、かなりうまく機能しています。以前は限られた数のアクティブ アトリビュート (メッシュあたり約 5 つ) を使用していましたが、今ではマテリアルにさらに多くのバリエーション (不透明度/カラーブレンドのさまざまな色合い) が必要であり、最終的には 100 以上の組み合わせになる可能性があります。これらの変更は実行時に発生するため、レンダリングが開始される前にそれらをまとめることはできません。確かにメッシュを再構築することはできましたが、それは遅く、マテリアル間の切り替えはインタラクティブな速度で行う必要があるため、そうではありません。
だから私の質問は、どのルートを取るのが最善ですか?
必要に応じて使用可能な属性 ID で顔を動的にマスクし、完了したらリセットする、より堅牢な属性処理システムを実装する必要がありますか? アトリビュート バッファのフラグメンテーションがパフォーマンス ヒットを追加することを聞いたことがあります。また、間にマテリアル スイッチがある後続の DrawSubset() 呼び出しのパフォーマンス ヒットについても確信が持てません (つまり、いつが多すぎて、いつアトリビュート配列を最適化する必要がありますか?)。これについて経験のある人はいますか?
私のもう 1 つのアイデアは、パラメーター化されたピクセル シェーダーを使用することです。派手なエフェクトは必要ありません。最低限必要なだけです (現在は、色のみで一部のオブジェクトが透明な組み込みのフラット シェーダーです)。そのため、シェーダー モデル 1 で十分です。ここでのアイデアは、1 つの汎用シェーダーを使用し、呼び出し間でマテリアルを切り替える代わりに、いくつかのシェーダー パラメーターを変更することです。しかし、これがマテリアルの切り替えよりも速いかどうか、および/またはプログラム可能なシェーダーがビルドインシェーダーよりも遅いかどうかはわかりません(同じ結果が与えられた場合)。
また、メッシュの切り替えと 1 つの大きなメッシュでの異なるサブセットの描画との間のパフォーマンス ヒットの違いについても興味があります (両方のケースで同じ数のマテリアル スイッチが与えられた場合)。
これらの質問は、GFXカードとそれぞれのパフォーマンス/年齢によって多少異なる場合があることを理解していますが、ここでは、何に最も力を注ぐべきかについての一般的なガイドラインを探しています (つまり、どのタイプの状態スイッチ/ CPU 干渉が最大のGPU ヒット)。メモリも懸念事項であるため、メッシュ全体 (または大部分) を複製する実装は私には不可能です。
私の焦点は、古い (5 歳)/機能の少ない/統合された GFX カードでのパフォーマンスであり、必ずしも最上位のゲーマー カードやワーク ステーション カード (Quadro など) ではありません。特定のボードでシェーダーのパフォーマンスがどれだけ優れているかに応じて、シェーダーを使用したソリューションを成功または失敗させる可能性があると思います。
すべての提案とフィードバックは大歓迎です。
よろしくお願いします!
c# - DirectX デバイスの作成後に StopWatch が整数を返す
質問はかなり「簡単」です。私は、C# で SlimDX を使用して DirectX9 と DirectX10 の両方で動作するエンジンを持っています。Stopwatch クラスを使用して、ゲームの時間を計り、ルーチンの速度をテストします。不思議なことに、DirectX9 の作成直後に StopWatch の浮動小数点が異常になり、GetTimeStamp()/Frequency 除算が整数値 (.000000 の単一値) のみを返します。なぜこれ?DirectX10 では、この問題は存在しないことに注意してください。(DirectX9でデバイスを開く直前にチェックを行うと、動作しません。)
これは、両方のバージョン (DirectX10 と DirectX9) で使用するコードです。
手がかりはありますか?
編集: QueryPerformanceCounter を使用してテストしましたが、結果は同じです。DirectX9 デバイスを作成する前に完全な計算を行い、その後は整数のみを作成します。
EDIT2:いくつかのテストの後、いくつかの浮動小数点値を表示することができましたが、精度が DirectX10 のものとはかなり異なります。
ここにいくつかの例があります:
DirectX10
フォームの作成: 110.09241
LoadContent フル: 738.64486
LoadContent ContentManager: 593.57572
DirectX9
フォーム作成: 112.45000
LoadContent フル: 489.50000
LoadContent ContentManager: 355.50000
EDIT3:別のマシンでテストした結果は同じです...デバイスを作成する前はすべて問題ありませんが、整数のみの後...
c# - DirectXでWebカメラフレーム上に3Dシーンをレンダリングする方法は?
AForgeを使用してWebカメラをキャプチャしているので、すべてのフレームをビットマップとして取得しています。その上にいくつかのシーンをレンダリングしたいと思います。現在、C#パネルコントロールを介してDirectX(SlimDX)シーンをレンダリングしています。
ビットマップをZBufferに配置する可能性はありますか、それとも他の方法で実現する可能性はありますか?
c# - APIに依存しない頂点処理に適したコード構造は何ですか?
現在、C# を使用して 3D メディア エンジンに取り組んでいますが、ちょっとした難問に遭遇しました。レンディング ループを把握し、優れたプラグイン アーキテクチャとコンテンツ管理システム、さらにはマテリアル パイプラインをすべて計画しました。エンジンは、両方の API のプログラム可能なパイプラインと共に、DirectX と OpenGL (「レンダラー」プラグイン経由) を使用する予定です。
とにかく、今週の初めに、私は頂点を処理するためのエンジンの抽象レイヤーに取り組み始めました (私はこれを何週間も恐れていました)。また、ご存じの方もいらっしゃると思いますが、グラフィック API 間の頂点処理はまったく関連していないか、同じではありません。ちょっと関連しています;)が、同じではありません。OpenGL では、頂点の処理は非常に簡単です。カスタムの頂点構造を作成し、それを GPU に送信してから、シェーダーに残りを処理させます。これは、柔軟なグラフィック パイプラインに最適です。OpenGL は、各頂点に含まれる要素を認識する必要はありません。一方、DirectX では、頂点構造ごとに宣言を作成し、それを GPU に送信する必要があります。
問題は、渡される頂点構造のタイプがわからないことです。また、列挙といくつかの抽象 'VertexDeclaration' クラスを介して頂点の各要素を宣言することを含む抽象化レイヤーを作成することは絶対に避けたいと思います。これにより、いくつかの問題が発生します。
1) 頂点要素を取得するのは、控えめに言っても面倒です。「VertexSemantic」を使用して頂点「a - z」の位置を求めることもできますが、スケルトン アニメーションなどで多数の頂点を処理する場合、多くのオーバーヘッドが発生する可能性があります。
2)エンジンの主な焦点が「初心者」であることを考えると、あまりユーザーフレンドリーではありません。ユーザーが大量のオブジェクトを宣言して貴重な開発時間を費やすことなく、カスタムの頂点とメッシュ バッファーを作成できるようにしたいと考えています。
3) もっと?
これで、属性を使って何らかの処理を行ってから、DirectX レンダラー内で頂点構造の宣言を作成できるようになりました。たとえば、いくつかの列挙型を作成します。
これで、ユーザーが頂点構造の各要素の「フィールド」に適用できる属性を作成できます。
カスタム頂点構造がどのように見えるかの例:
これはいいでしょう。DirectX プラグイン (レンダラー) では、各構造型のセマンティクスを作成できるユーティリティ クラスを作成し、データをキャッシュするだけで、頂点ごとに宣言を再作成する必要がなくなります。
NONE 列挙値を ELementUsage に追加して、カスタム値を何にでも使用できるようにすることもできます...しかし、DirectX では各頂点をマークする必要があるため、OpenGL でのみ機能します...ない。
私の質問:
これを行うためのより良い方法はありますか (属性を使用する以外に)? DirectX で VertexDeclarations を使用しないようにする方法はありますか? 「私の」質問でわからないことはありますか?
編集:
属性を使用する際の問題は、各頂点から要素データを取得することです。メッシュ バッファー内の各頂点の位置を取得したいとします。属性を使用したため、「vertex.Position」だけでは実行できません。「Utility.GetElement(vertex, ElementUsage.POSITION)」のように、頂点構造からフィールド参照を抽出できるユーティリティ メソッドを作成する必要があります。 . このメソッドは、最初にリフレクションを使用して属性を見つけ、次にフィールド値への参照を返す必要があります。値を設定することさえ(私は思う)不可能でしょうか?
もう 1 つの方法は、IElement インターフェイスを作成し、各要素 (Positon、Normal など) を実装することです。インターフェイスには、継承された要素構造内で直接返すことができる Name プロパティを含めることができます。これは、PositionElements の Name プロパティが単に「Positon」を返すようにするためです。
次に、AddElement(IElement)、GetElement(string name)、GetElement(int index)、Insert、Replace などのメソッドを含む Vertex 構造体内に IElement の配列を保持できます。DirectX で認識されるすべての要素を実装して、レンダラー プラグインは、頂点構造を解析して頂点宣言の配列を作成できます。
これに関する問題は、配列 '[]' を頂点要素データとして使用できるかどうかわからないことです。同様に、頂点構造体 (IElement 配列を含む) を DirectX に直接渡し、次に GPU に渡すのを妨げる、配列に含まれる他のバイト (存在する場合) は何ですか?
このように実装することは、私が必要としているものに完全に最適です。もう 1 つの質問は、IElement (要素) の継承型がクラスになる可能性があるか、それとも要素値が値型でなければならないかということです。
c# - SlimDX viewports in WPF controls
I am transitioning from WinForms/XNA to WPF/SlimDX because:
- a) all of the benefits of WPF over WinForms (but learning curve = ouch!)
- b) I would like to have multiple SlimDX viewports attached to Panels. XNA has 1 "game" screen.
- c, last and least) DirectX 10 support
All of my previous XNA code is in C#. I am having trouble figuring out how to port this over to SlimDX and WPF on a high level. I have searched like crazy. The closest I have found are:
1) http://www.gamedev.net/community/forums/topic.asp?topic_id=507941 Many articles point to this discussion, however it is incomplete and I can't figure out the XAML, and I get device errors after attaching all of the _slimDXDevice and Window1 events that were left out.
2) http://www.codeproject.com/KB/WPF/D3DImage.aspx This article assumes the user is porting C++. I am porting XNA code which is very close to MDX code.
If I could get to the point where I have a WPF form with a custom SlimDX driven viewport that was just a blue box, I could go from there. In XNA I rendered many separate RenderTargets and placed them all over the screen, now I want to attach them to controls. But first, just 1 blue box! :D
Any ideas? I feel that this is either simple or that there's some "cookie cutter" code that I'm missing. Greatly appreciated!
c# - 私が最初にデバイスを作成した表面(フォーム)を破壊した場合はどうすればよいですか...?
SlimDXベースのゲームエディタがあるとしましょう。基本的にデバイスのすべての状態を制御し、失われたデバイスを処理し、デバイスを作成するなどのDeviceContextインスタンスがあります。エディターは、レンダリングが行われている場所で常にビューポートを開いているとは限りません。代わりに、さまざまなエディター、シーンエディター、テクスチャビューアー/エディター、アニメーションエディター、マテリアルエディターなどが含まれています。
ここで、ユーザーがSceneEditor(4つのビューがパネルにレンダリングされたダイアログ)を開いたとします。エディターがインスタンス化されると、DeviceContextから参照を取得し、「null」が見つかった場合は、context.CreateDevice(Control ctrl)を呼び出します。この方法は、デバイスが紛失、無効化、または廃棄されないことを「保証」します。もしそうなら、それは何が起こっているかに基づいてそれを処理します。これで、エディターは、デバイスの作成/リセット時に使用するコントロール(パネル)の「CreateDevice」メソッドを送信します。このコントロールは、TopLeftビューを表すパネルです。次に、コンテキストから「デバイス」参照を取得し、そのスワップチェーンビュー(他の3つのビューポートパネル)を作成します。
ここで、ユーザーがModelViewerダイアログを開いたとします。これも、デバイスインスタンスが「null」でないことを確認します。その場合、DeviceContext.CreateDevice(ModelViewPanel)を呼び出し、そこからデバイス参照を取得します。デバイスがnullでない場合、そのビュー(モデルがレンダリングされる場所)のスワップチェーンが作成されます。
これで、4つのビュー(TopLeft PanelがDeviceオブジェクトの作成に使用されるコントロール)と、スワップチェーンとして作成された他の3つのPanelオブジェクトを備えたシーンエディターができました。次に、ユーザーが開いたModelViewerがあります。これには、スワップチェーンとして作成された単一のパネルがあります。
私の質問は次のとおりです。シーンエディターにはデバイスインスタンスを最初に作成したコントロールがあるので、ユーザーがシーンエディターを閉じた場合はどうすればよいですか?Devi)ce.Reset()を呼び出すか、ModelViewerのプレゼンテーションパラメーターを使用して「新しい」Device()を作成しますか?
何かが理解されていない場合は、質問をリファクタリングするように依頼してください。ありがとうございます。
c# - WPFとSlimDxの使用(DirectX 10/11)
しばらくの間、WinFormsでSlimDXを使用していますが、今すぐWPFに切り替えたいと考えています。ただし、DX10/11をWPFで動作させる方法がわかりません。SlimDXの2月のリリースでは、WPFの例が提供されていますが、これはDX9でのみ機能します。次の解決策を見つけました:http://jmorrill.hjtcentral.com/Home/tabid/428/EntryId/437/Direct3D-10-11-Direct2D-in-WPF.aspx ですが、SlimDXで動作させることができません。SlimDXテクスチャから共有ハンドルを取得する方法がわからないため、私の主な問題は共有リソースハンドルです。このトピックに関する情報が見つかりません。
C ++では、コードは次のようになります。
基本的に、私がやりたいのは(これが解決策だと思うので)、Direct3d9DeviceEx(WPF D3DImageをレンダリングするため)とDirect3d10Device(シーンのテクスチャレンダリングターゲット)の間でテクスチャを共有することです。
正しい方向へのポインタは大歓迎です。
c# - SlimDX Device.Reset が「D3DERR_INVALIDCALL: Invalid call (-2005530516)」エラーでクラッシュする
最近、 (Windows XP)からVS 2005にアップグレードしました。VS 2008プロジェクトの1つで使用SlimDxします。でクラッシュする devicelost/device reset で呼び出される私の回復機能を除いて、すべてがアップグレード後に正常に機能していました
D3DERR_INVALIDCALL: 無効な呼び出し (-2005530516)
私はCtrl- Alt-Delを使用Escapeしてから、デバイスの紛失をシミュレートします。
VS 2008以前は とうまく機能していたので、これは と関係がありVS 2005ますか?