問題タブ [dxgi]
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++ - Direct2D レンダー ターゲットにバインドされた DXGI スワップ チェーンのサイズ変更
ID2D1Factory::CreateDxgiSurfaceRenderTarget で作成された Direct2D レンダー ターゲットがあります。WM_SIZE メッセージを受け取ったら、IDXGISwapChain::ResizeBuffers を呼び出して対応するスワップ チェーンのサイズを変更しようとしましたが、DXGI_ERROR_INVALID_CALL (0x887a0001) で失敗しました。ResizeBuffers のドキュメントに次のように記載されているためだと思います。
バック バッファーへのすべての未解決の参照を解放しない限り、スワップ チェーンのサイズを変更することはできません。ResizeBuffers が成功するためには、バック バッファーの直接参照と間接参照をすべて解放する必要があります。
直接参照は、リソースに対して AddRef を呼び出した後、アプリケーションによって保持されます。
間接参照は、リソースへのビューによって保持され、リソースのビューをデバイス コンテキスト、リソースを使用したコマンド リスト、そのリソースへのビューを使用したコマンド リスト、使用した別のコマンド リストを実行したコマンド リストにバインドします。リソースなど。
ID2D1RenderTarget::CreateDxgiSurfaceRenderTarget によって作成された Direct2D レンダー ターゲットは、そのような間接参照の 1 つだと思います。しかし、ウィンドウのサイズが変更されるたびにレンダー ターゲットを再作成する必要があるとは想像できません。
visual-c++ - DXGI プレゼンテーションの最大フレーム遅延
現在の間隔が 1 で、ユーザー入力と対話するアプリの場合、IDXGIDevice1::SetMaximumFrameLatencyを介して最大フレーム遅延 > 1 を設定する動機/シナリオがあるかどうかを理解しようとしています。低い最大フレーム レイテンシの利点がユーザー入力のレイテンシを削減することであることは明らかですが、どのようなシナリオで 2 または 3 の最大フレーム レイテンシが保証されるかは明らかではありません。現在表示されているフレームが終了するまで待機する必要があるため、アプリは追加のフレームをキューに入れることしかできません。
誰かがこれについて何か考えを持っているなら、それはありがたいです。特に、誰かがより高い最大フレーム遅延が本当に役立つシナリオを概説できる場合:)
ありがとう。
c++ - デバイスとスワップ チェーンに同じ IDXGIFactory を使用する理由
IDXGIFactory インターフェイスの参照は、スワップ チェーンを作成するために、Direct3D デバイスの作成に使用されたものと同じファクトリを使用する可能性があることを示しています。
スワップ チェーンを作成せずに Direct3D デバイスを作成できるため、スワップ チェーンを作成するには、デバイスの作成に使用されるファクトリを取得する必要がある場合があります。
また、次のコード例も示します。
記事は非常に控えめで、完全に理解しようとすると、次の 2 つの疑問が生じましたが、最初の疑問が主な疑問です (このスレッドのタイトルに関するものです)。
スワップ チェーンを作成するために、Direct3D デバイスの作成に使用したものと同じファクトリを使用する必要があるのはなぜですか? ファクトリ インスタンスは、重要な内部状態を維持していますか?それとも、リソースを消費するファクトリの別のインスタンスを作成しないようにするだけですか?
また、コード サンプル内で、次のコード行に苦労しています。
私にとって、IDXGIAdapter が IDXGIDevice の親であることは論理的ではありません。それ以外の場合、IDXGIAdapterには、アダプターをデバイスの親にする CreateDevice のようなメソッドが必要です。しかし、そうではありません。アダプターがデバイスの親であるのはなぜですか?
directx - IDXGISurface の領域を切り取る方法は?
私は初心者なので、私の質問はばかげているように聞こえるかもしれません。いくつかのデータ/画像を保持する IDXGISurface があります。そこから特定の長方形領域を切り取って、同じ IDXGISurface または別の同様のサーフェスに格納したいと考えています。Direct2D は、レイヤーを介してそれを行う方法を提供すると思います。これに関するガイダンス(ステップバイステップが望ましい)が役立ちます。
directx-11 - DirectX11 スワップチェーンとウィンドウがフルスクリーン ステータスを失う
サンプル プログラムに全画面表示のサポートを追加しているときに、このちょっと厄介な動作に出くわしました。
全画面ウィンドウの作成は機能しますが、全画面ウィンドウを含む出力で (別のアプリケーションから) ウィンドウを移動するとすぐに、自動的にウィンドウ表示に戻ります。
この動作を防ぐ方法はありますか (全画面ウィンドウがウィンドウ表示に戻らないようにするため)。
参考までに、これは小さなスタンドアロンの例です (問題は簡単に再現できます)。
また、それが役立つ場合、私は Windows 8.1 で実行しています。
私はすでに WindowAssociationFlags と SwapChainFlags を変更しようとしましたが、Discard の代わりに FlipSequential を使用するのと同じように、どちらも成功しませんでした
編集: C++ サンプルも試しました (Microsoft から DirectX11 の基本的なチュートリアルを取得し、フルスクリーン スイッチを追加しました)。これは同じ動作につながるため、SharpDX 固有の問題ではありません。
メッセージ ループを調べたところ、これが発生すると、最初のフルスクリーン モードがウィンドウ モードに戻り、WM_DISPLAYCHANGE メッセージが表示されます)。
c++ - DXGI デスクトップ複製: フレームをエンコードしてネットワーク経由で送信する
画面のビデオ ストリームをキャプチャしてリモート クライアントに送信するアプリを作成しようとしています。Windows で画面をキャプチャする最善の方法は、DXGI Desktop Duplication API (Windows 8 以降で利用可能) を使用することであることがわかりました。Microsoft は、複製されたフレームを画面にストリーミングするきちんとしたサンプルを提供しています。さて、これらのフレームをエンコードしてネットワーク経由で送信する最も簡単で比較的高速な方法は何だろうと考えていました。
フレームAcquireNextFrame
は、更新されたダーティ リージョンとムーブ リージョンを含むデスクトップ ビットマップとメタデータを含むサーフェスから取得されます。ここから、いくつかのオプションがあります。
- DirectX サーフェスからビットマップを抽出し、 ffmpegなどの外部ライブラリを使用して一連のビットマップを H.264 にエンコードし、RTSP 経由で送信します。この方法は簡単ですが、ネイティブの Windows メソッドを利用していないため、遅すぎるのではないかと心配しています。D3D テクスチャを ffmpeg 互換のビットマップに変換するのは、不要な作業のように思えます。
- この回答から: D3D テクスチャを IMFSample に変換し、MediaFoundation のSinkWriterを使用してフレームをエンコードします。このビデオ エンコーディングのチュートリアルを見つけましたが、ビデオ ファイルにすべてをダンプする代わりに、エンコードされたフレームをすぐに取得して送信する方法をまだ見つけていません。
以前にこのようなことをしたことがないので、正しい方向に進んでいるかどうかを尋ねています. 最終的には、リモート デバイスから表示できる、シンプルでできれば低レイテンシのデスクトップ キャプチャ ビデオ ストリームが必要です。
また、Desktop Duplication が提供するダーティ リージョンとムーブ リージョンを利用できないかと考えています。フレームをエンコードする代わりに、ネットワーク経由で送信し、クライアント側で処理を行うことができますが、これは、クライアントで DirectX 11.1 以降を使用できる必要があることを意味します。これは、モバイル プラットフォームにストリーミングしたい場合には不可能です。 .
c++ - MF SinkWriter のメモリの問題
DXGI Desktop Duplication API と MF Sink Writer を使用して、デスクトップ (1920x1080) の画像をビデオ ファイルにエンコードしようとしています。私のエンコーディング スレッドは次のようになります。
初期化ルーチンは、Desktop Duplication SampleおよびSink Writer Tutorialから直接取得されます。ビデオ形式の定義も Sink Writer チュートリアルから取られ、フレーム解像度とVIDEO_INPUT_FORMAT = MFVideoFormat_ARGB32
.
ただし、このループを ~20 回 (場合によってはもう少し、場合によっては少し) 通過した後、次の HRESULT メッセージで失敗しmSinkWriter->WriteSample()
ます。mDeskDupl->AcquireNextFrame()
アプリケーションが無効な呼び出しを行いました。呼び出しのパラメーターまたは一部のオブジェクトの状態が正しくありませんでした。デバッグ メッセージで詳細を表示するには、D3D デバッグ レイヤーを有効にします。
D3D デバッグ レイヤーを有効にすると、フレーム (これらのオブジェクトは私のフレームだと思います) が何らかの理由で解放されず、積み上げられ続けることがわかります。
D3D11 警告: 0x0000006504FFC290 のライブ オブジェクト、参照カウント: 17。[ STATE_CREATION 警告 #0: 不明]
HRESULT の失敗は、GPU がメモリ不足になっていることが原因であると確信しています (GPU-Z ユーティリティを介して GPU メモリの使用状況を監視することでも確認されています)。ただし、割り当てているすべてのリソースを解放しているため ( SafeRelease 実装)、このメモリ リークの原因はわかりません。
編集:ポインターをスマート ポインターに変更し、マクロ定義を追加しました。
directx - D3D11_FORMAT_SUPPORT の使用方法
シャドウに PCF を適用したいので、シャドウ マップ テクスチャ フォーマットを に設定する必要がありますDXGI_FORMAT_R24_UNORM_X8_TYPELESS
。I cannot run my program を設定した後、エラーなしでクラッシュします。その理由は、私のGPUがそのフォーマットをサポートしていないためであり、そのためにフォーマットのサポートを確認したいと考えています。ここにリンクの説明を入力してください
これが私のコードです
しかし、 で作業する方法pSup
。D3D11_FORMAT_SUPPORT_SHADER_SAMPLE_COMPARISON
、D3D11_FORMAT_SUPPORT_RENDER_TARGET
および を サポートしているかどうかを確認する必要がありD3D11_FORMAT_SUPPORT_DEPTH_STENCIL
ます。ここにもリンクの説明を入力してください