問題タブ [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.
slimdx - KeyedMutexを使用したSlimDXワープデバイス
KeyedMutexを介してDirectX11でDirect2Dを使用しています。ハードウェアデバイスを使用している場合は、すべてがうまく機能します。デフォルトでWarpデバイスを使用すると、Texture2Dオブジェクトを作成するときに問題が発生し、「Direct3D11Exception:E_OUTOFMEMORY:Ranoutofmemory」というエラーメッセージが表示されます。
これらは責任がある行です:
繰り返しますが、ワープではなく、ハードウェアデバイスを使用してすべてがうまく機能します。PIXに対して実行すると、次のように表示されます。
<0x09033390> ID3D11Device:CreateTexture2D(0x0FD1E330、NULL、0x0FD1E32C-> NULL)
これはWarpドライバーを使用していますが、最後のNULLがNULLではないハードウェアを使用すると、D3D11Texture2Dオブジェクトを指す実際のポインターになります。
何かご意見は?ここに多くのコードを含めていないことは知っていますが、DXルーチン全体を投稿しなくても、誰かがこれが何であるかを知ってくれることを望んでいました。必要に応じて行います。
私はデバッグと10.1DXを使用します。デバッグ出力は次のとおりです。
directx - Direct3D のワールド空間座標
Direct3D キャンバスに背景画像があります。背景の特定の位置に円を描いています。キャンバスがカメラで (ワールド/ビュー/プロジェクションを使用して) ズーム/パンされた後、背景が更新されます。
問題は、円を再描画するための画像上の以前の位置が見つからないことです。次の関数 (DirectX 11.1) を使用して座標を見つけています。しかし、それは機能していません。
XMMatrixIdentity を世界として試してみました。しかし、成功しません。誰でも私を助けてもらえますか?
c++ - 商用ゲームはオンザフライでのフォントの読み込みをどのように処理しますか?
これは、擬似コードでフォントレンダリングを処理する方法です(簡略化):
そのため、最も使用されているフォントの一部、またはゲーム内で使用されたことのあるすべてのフォントをキャッシュできます。ただし、一部のアプリでは、ユーザーは、アプリがこれまでに見たことのない別のフォント/サイズ/スタイルをその場で選択するだけで、すぐに適用されます。または、たとえば、一部のゲームでは、ユーザーがゲーム フォルダー内の「font.tff」ファイルを置き換えることができ、ゲームは起動時に多くのサイズ/スタイルで、何千もの Unicode 文字ごとに、追加の時間のかかるプリロードなしで使用します。奇跡!
このようなものが必要です-オンザフライのフォント読み込み。
もちろん、必要に応じてグリフを個別にロードし、グリフごとにレンダリングできますが、これは、バッチ処理がなく、フレームごとに数千回の Draw 呼び出しが必要であり、GPU 帯域幅が膨大であることを意味します。OpenGL では問題ないかどうかはわかりませんが、D3D11 では問題ありません。
彼らはゲームスタジオでどのようにそれを行うのですか? 多分あなたは別のアプローチを知っていますか?フォントをジオメトリ、GPU 処理、および複雑な曲線アルゴリズムとしてレンダリングすることについて聞いたことがありますが、Google で役立つ情報を見つけることができません。
どんな助けでも大歓迎です!
graphics - d3d11 のレンダー ターゲットからピクセル データを読み取る
texture2d
をデバイス レンダー ターゲットとして設定します。描画後、レンダー ターゲットからピクセルを直接読み書きし、それを表示するにはどうすればよいですか。
c++ - Windows ストア アプリの Direct3D11 での動的バッファーのマッピング
Direct3D11 でインスタンス化されたジオメトリを作成しようとしていますID3D11DeviceContext1->Map()
が、インスタンス バッファーを更新しようとすると、「無効なパラメーター」という非常に役立つエラーで呼び出しが失敗します。
バッファーはメンバー変数として宣言されます。
Microsoft::WRL::ComPtr<ID3D11Buffer> m_instanceBuffer;
次に、それを作成します(成功します):
ただし、マップしようとすると:
マップ呼び出しは で失敗しE_INVALIDARG
ます。NULL
これは私の最初の D3D アプリの 1 つであり、追跡するために次に何をすべきか現在困惑しています。バッファを間違って作成しているに違いないと思っていますが、方法がわかりません。任意の入力をいただければ幸いです。
c++ - D3D11 は参照カウントをどこからともなく増やしましたか?
私はかなり長い間 d3d11 を使用してきましたが、directx デバッガーを発見した後、最近、私のプログラムが適切に解放されていないすべての com オブジェクトからメモリをリークしていることを発見しました。少しスヌーピングし、何時間もコードを見つめた後、これらの予期しない参照カウントの増加が発生している場所を特定する方法をいくつか開発しました。
まず、すべてのオブジェクトが std::shared_ptrs にラップされ、それぞれのリリース関数を呼び出すカスタム デリーターが含まれています。これを行ったのは、addref を呼び出す必要がないようにするためであり、オブジェクトがスコープ外になったときにのみ、deleter 内の release への最初の呼び出しが呼び出されるようにしました。次のようになります。
問題は、API呼び出しの特定のランダム関数が参照カウントをランダムに増加させるだけで、後で対処する必要があることです。
私が診断に役立つと思ったのは、次のような関数でした。
これは、そのカウントをインクリメントおよびデクリメントして、そのオブジェクトの現在の参照数を取得します。これを使用して、カスタム デリーターのリリースが呼び出される直前に、作成した 1 つの ID3D11Device への未解決の参照が 10 個あることがわかりました。不思議なことに、私はゆっくりとバックトラックし、最初に作成した場所まで、プログラムをずっとさかのぼってこの関数を呼び出しました。面白いことに、最初にオブジェクトを作成した直後 (shared_ptr が所有権を取得する前であっても)、未処理の参照の数はすでに 3 です! これは、この直後に発生します。
デバイスを作成するこのような関数を呼び出すのはこれが初めてで、直後に参照がいくつあるかを確認すると、3 と表示されます。明らかに、これらの com オブジェクトの処理方法について、私は何かを誤解しています。ナンセンスをカウントする舞台裏の参照を使用するのではなく、手動でそれらを削除できる方法はありますか?
3d - DirectX Unproject のトラブル
正射投影を使用しており、スクリーン スペースから点を投影解除しようとしています。
ビュー行列と射影行列は次のとおりです。
Point を非投影にする方法p
は次のとおりです。ポイントは画面ピクセルで指定されます。
コードが機能しません。マトリックスm
には のみが含まれていNan
ます。反転しようとするview * proj
と、ゼロのみのマトリックスが返されます。
したがって、私の問題は正投影行列と関係があると思われます。
ここに私の質問があります:
- この問題は、OrthoOffCenterLH プロジェクションの値が大きいためにアンダーフローが発生した可能性がありますか?
x,y,width,height
で渡す必要があるパラメーターは何Unproject(...)
ですか?minZ
パラメータとmaxZ
パラメータにはどのような意味がありますUnproject(...)
か?- で何を渡すかは重要
p.Z
ですUnproject(...)
か?
directx - Direct2D Direct3d11 相互運用 - デバイスが失われる可能性はありますか?
私のアプリでは、direct2d を使用して共有 (d3d11/d3d10) テクスチャに書き込みます。これは、私のアプリで使用される唯一の種類のレンダー ターゲットです。デバイスは direct2d (D2DERR_RECREATE_RENDER_TARGET) で失われる可能性があるため、デバイスに依存するリソースを抽象化および/または再作成するためのコードが多数存在します。しかし、私はまだこのような状況が実際に起こっているのを見ていないので、無駄な努力をしているのではないかと気になります. このシナリオではレンダー ターゲットが実際に失われる可能性がありますか、それともテクスチャが d3d11 を介して作成されているため (d3d10 と共有されていますが) 保護されていますか? もしそうなら、少なくともこの状態を処理するコードをテストできるように、レンダーターゲットを失わせる再現可能な簡単な方法を誰かが知っていますか?
opengl - System.Drawing.SolidBrush はどのブレンド方程式を使用していますか?
System.Drawing.SolidBrush を使用して半透明の三角形を描画する GDI コードがあります。適切な 3D レンダリング API (OpenGL/Direct3D11) を使用してコードを再実装しようとしていますが、元の GDI コードと同じ出力を得るためにこれらの三角形に使用するブレンド方程式がわかりません。
加算ブレンディング (func=GL_FUNC_ADD, eq=GL_ONE,GL_ONE) や補間 (func=GL_FUNC_ADD, eq=GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) のような比較的単純なものだと思いますが、どちらもまったく正しくないようです。これはほぼ間違いなく新しいコードのバグによるものですが、続行する前に正しいターゲットに向かって作業していることを確認したいと思います。適切なブレンド方程式を知っている人はいますか?
編集: コンテキストを取り除いた関連する C# コードを次に示します。
私の質問は、ブラシの RGBA と宛先ピクセルの RGBA に関して、実際にどの色が書き込まれるかということです。私が見つけることができるすべてのドキュメントは、「アルファを使用してブラシの透明度を制御する」または同様に漠然としたものと言っています。実際のブレンド方程式がどうなっているのか興味があります。