0

そのため、「オンボード」の Windows SDK 8 で Visual Studio 2012 を使用し、Direct3D11 アプリケーションを作成していますが、大きな問題があります。D3D11 の上にすべての初期化、セットアップ、および描画呼び出しを処理するクラスがあります。D3D11 ドライバー クラスのインスタンスを適切に保持するアプリケーション クラスを、必要なすべてのデータと共にインスタンス化します。

D3D11 ドライバー クラス コンストラクターは、アプリケーションのプライマリ ウィンドウ ハンドルを取得し、それを使用して D3D をアプリケーションのプライマリ ウィンドウにフックします。それ自体を適切に構築しapp->run()、メインループを駆動する呼び出し元を返します。

メイン ループでは、そのドライバーが呼び出され、空白の赤みを帯びた画面を単純にテスト描画します。デバッグ情報を観察すると、問題のレンダー ターゲットは操作可能であり、スワップ チェーンからパイプラインにバックバッファーをバインドするために作成されています。

renderTargetView NULL ではありません。HRESULT は S_OK であることが検証されます。

D3D11 ドライバー クラス コンストラクター内で Draw 関数を呼び出そうとすると、機能します。呼び出しの間に割り当てが解除されることはありません。

Application クラスのコンストラクターが run() 関数の前に終了しないようです。数「フレーム」先に終了せずに続行しようとすると、クリアされたレンダー ターゲットの赤みがかった色合いが表示されます。誰か教えてください。私は知恵の果てにいます。

NULL ではありません。HRESULT は S_OK であることが検証されます。これは Windows 8 で修正されたという報告がありますが、Win7 SDK にはまだ問題があります。Google は有用なものを提供しません。ほとんどの人は、レンダリング ターゲット ビューを作成するのを忘れたり (NULL のまま)、OMGetRenderTargets の intellisense-miss OMSetRenderTargets を作成したりしません。

4

1 に答える 1

3

null ポインターを逆参照すると、未処理の例外はほぼ例外なく削除されます。有効に初期化された(即時の) コンテキストのClearRenderTargetView()インスタンス メソッドである、または

ID3D11DeviceContext::ClearRenderTargetView(...)

レンダー ターゲット ビューを初期化しなかったり、OMGetRenderTargets(...)代わりに を呼び出したりするという些細な間違いを犯していなければOMSetRenderTargets(...)、コンテキストが null であることは間違いありません。あなたの声明によると、あなたはこれらの過ちを犯すことを明確に否定しています。

assertあなたのコンテキストが実際にNULLであるという私の主張を確認するために使用してください。ドライバーコンストラクターで機能し、後でアプリケーションクラスのメンバーとして使用されたときに機能しないため、ドライバークラスで適切なコピー代入演算子を提供していない可能性があります。そのため、未処理の例外ボックスがドロップされます。コンテキストを初期化した後、参照コピーの欠落が原因で持続しません。オブジェクトが初期化されている間、オブジェクトは部分的に有効です。そのため、一度だけ機能します。

これは単なる仮説であり、私はかなり確信していますが、コードが不足しているため、想像力と論理しか使用できません。さらに支援が必要な場合は、報告してください。

于 2013-01-24T03:11:02.753 に答える