問題タブ [directx-12]
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++ - GetCPUDescriptorHandleForHeapStart スタックの破損
DirectX 12.0 でプログラミングしているときに、かなり変わった問題に遭遇しました。これまでのところ、洞察に満ちた研究はありません。
C (C++ ではありません) を使用してプログラミングしています。公式の DirectX 12 ヘッダーは C と C++ の両方のバインディングをサポートしているように見えますが、C と同等のコードを記述して上記のタスクを実行するとクラッシュが発生しますが、C++ はそうではありません。エラーが私のものだとは思いません。
詳細は次のとおりです。D3D12 デバイスの初期化手順には、次のコード ブロックがあります。
ここで、hRTVは「レンダリング ターゲット ビューへのハンドル」(D3D12_CPU_DESCRIPTOR_HANDLE) を表し、 pRTVHeapは「レンダリング ターゲット ビュー ヒープへのポインター」(ID3D12DescriptorHeap) を表します。
これはC++の同等物です - これはうまくいきます:
コンパイル時のエラーはありませんが、実行時に C でこのメソッド (GetCPUDescriptorHandleForHeapStart) を呼び出すと、スタックの破損がトリガーされます (%ESP は 4 バイト分置き換えられます)。
メソッドの逆アセンブリを調べ、RET (リターン) 命令を書き留めました。
__stdcall
アセンブリと (願わくば) COM (コンポーネント オブジェクト モデル) オブジェクトの呼び出し規則に精通している人にとってthis
は、スタック上で渡される (または同等の) ポインターが最初のパラメーターです (この場合、唯一のパラメーターである必要があります)。これは、COM オブジェクトが独自のデータにアクセスできるようにする方法です。
次のコード スニペット (これも上に表示) は、私の混乱を招くものであり、当然のことながら、ランタイムが「スタック ポインターの位置合わせが正しくない/スタックの破損」(%ESP) エラーをスローする場合に、混乱を招きます。
この場合、1 つのパラメーターのみを渡す必要があります (this
ポインター)。ポインターのサイズ (32 ビット システム - 私のターゲット アーキテクチャは x86) は 4 バイト (32 ビット) ですが、呼び出し先がスタック上の 8 バイトをクリーンアップするのはなぜですか?
これをバグと呼ぶのは正しいですか?この問題について Microsoft に通知する必要がありますか? 私が間違っている?
お時間をいただきありがとうございます。私よりも多くの知識をお持ちの方に教えていただければ幸いです。CよりもC++を好むという古くからの議論を提案しないでください.
c++ - 頂点/インデックス バッファーをどのように読み取りますか?
基本的に、私の質問は次のとおりです。DirectX 12 で頂点/インデックス バッファーをどのように読み取るのですか? DirectX 11 の map 関数に相当するものを探していると思いますが、これは手動で行う必要があることを理解しています。答えをグーグルで検索してみましたが、何も見つかりませんでした。DirectX 12 はかなり新しいため、サンプルやチュートリアルはあまりありません。
c++ - D3D12 で複数のオブジェクトを描画する
DirectX 12 をいじっていて、「チェッカー ボード」を描こうとして壁にぶつかりました。ネットをかなり検索したので、ヘルプ/ポインターをいただければ幸いです。
D3D11 での作業コードは次のとおりです。
D3D12 で同じことを試みましたが、すべての正方形が同じ場所にあるため、翻訳がグローバルに実行されているようです。
ありがとう、チェルシー
c++ - スワップチェーンで renderTarget ごとにアロケーターを作成することは理にかなっていますか?
Microsoft の HelloWorld の例では、ほとんどの場合、単一の CommandAllocator を使用してから、前のフレームが完全に完了するまで待機します。ただし、彼らは(すべて大文字で)それがどのように行われるべきではないとも言っています。
したがって、私の考えは、スワップチェーンでフレームごとに Allocator を作成し、循環バッファーで待機するフェンス値を保持することです。
これは健全なアプローチですか?それとももっと良い方法がありますか?
c++ - C++ ofstream: 出力ファイルが見つかりません
デフォルトの DirectX12 アプリケーション (回転する 3D キューブ)void DX::DeviceResources::Present()
を作成し、その中でバックバッファーをファイルに書き込もうとしています。
ここで問題が発生します。
バックバッファの内容を書き込もうとする前に、最初にファイルを書きたいだけです(ここで方法を示しています)。なんらかの理由で、出力ファイルが見つかりません...プロジェクト内のすべてのディレクトリ、さらには Microsoft DirectX SDK フォルダーまで、あらゆる場所を検索しました。
例外はスローされず、エラーなしでデバッグ中に各行をステップ実行できます。
それはどこでしょうか?
c++ - ofstream.is_open() は、VS 2015 を使用する DirectX12 アプリケーションでは常に false
私は何時間も試みてきましたが、DirectX12アプリケーションで単純なファイルを書き込むことはできません...
私のセットアップについて少し:
- Windows 10 が更新されました。
- DirectX12 デフォルトの「スピニング キューブ」アプリケーション。DirectX 12 アプリ (ユニバーサル Windows)
- ビジュアル スタジオ 2015
私はこれをやっています:
私が試したこと(太陽と台所の流しの下のほとんどすべて):
- 私も試してみまし
fstream
たwfstream
!outfile.fail()
- 私は自分のプロジェクトのすべてのディレクトリをチェックし、Microsoft DirectX SDK にまで足を踏み入れました。
- 私は相対パスを試しました:
outFile.open("WHERETHEFISMYFILE.txt");
- 絶対パスを設定してみました。
- 「全員」を許可し、フルアクセスを許可することで、フォルダーにアクセス許可を追加しようとしました-正気のために。
- また、現在の作業ディレクトリを取得して、
C:\Users\pookie\Documents\Visual Studio 2015\Projects\demoDX12\x64\Debug\demoDX12\AppX
それをc:\
- プロジェクトのすべてのフォルダーに手動でファイルを作成しました...
- デバッグ構成とリリース構成の両方、x86 と x64、およびそれらの可能なすべての組み合わせを試しました。
- ファイルパス
\\
と同様に試しました//
- パスのスペースを %20 に置き換えてみました
- また、Visual Studio を管理者モードで実行してみました。
ここで問題が発生します: if (outFile.is_open())
。何らかの理由で、常に false を返します。
ここで何が間違っていますか?
更新: 心を休めるために、次のコードで空のコンソール アプリケーションを試しました。
結果は同じです: is_open() == false
. 私はここで途方に暮れています。
更新 2:
要求に応じて、この質問を更新して、私が取り組んでいる正確なプロジェクトを示しています。デフォルトの DirectX12 アプリケーションである回転キューブを使用しています。このチュートリアルに従いました
私のプロジェクト内には、呼び出されたメソッドがあり、void DX::DeviceResources::Present()
ファイルに書き込もうとしているのはこのメソッド内です(ただし、このプロジェクト内の他の多くの場所でもこれを試しました.
ここにあります:
アップデート 3
したがって、ファイル出力のある空のプロジェクトは、使用すると正常に動作します
注意してくださいios_base::out
これで問題ありません。ただし、これはデフォルトの DirectX12 アプリケーションではまだ機能しません。
これは間違いなく DirectX 関連の問題です。これを参照してください。その投稿で提案されている解決策を試してみましたが、まだ機能しません。
また、新しい DirectX12 プロジェクトにも同じ問題があることを確認できます。それを試してみてください。
解決
ebyrob のおかげで、私はこれを機能させました。これらの新しい Windows アプリは、特定のフォルダーにしか書き込みできないことが判明しました...より具体的には、これは次のとおりです。
残念ながら、パスは標準の文字列ではないため、最初に変換する必要があります。
次に、ファイル名を追加します。
そして最後に:
エビロブありがとう!!