問題タブ [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.
directx - DXGI デスクトップのキャプチャ
を使用してループでデスクトップ キャプチャを行っていますDXGI
。その中で、この関数をループで呼び出します。
しかし、時々map.pBits
ですnull
。何時だか判りません。ランダムな時間のようです。Sleep()
ループの時間を増やしても、にはなりませんnull
。私にその理由を教えてください...
c++ - インテル統合グラフィックスの誤認 (DXGI)
DirectX 12 によって処理されている空白のスワップ チェーンでウィンドウを埋めています。Explicit Multi-Adapter で少し遊んでいると、この奇妙な動作に遭遇しました...
これまでに存在するほぼすべての DX12 デモ コードで示されているように、使用するすべての DXGI アダプターをループして、1IDXGIFactory4::EnumAdapters1()
つ以上の最適な (または私の場合はすべての) アダプターを見つけますD3D_FEATURE_LEVEL_11_0
。DXGI_ADAPTER_FLAG_SOFTWARE
そして、デモに示されているように、次のようなすべてのアダプターを破棄します。
私の実装では、互換性のあるすべてのアダプターをstd::vector
後で使用するためにダンプします。
実行時にすべてがどのように見えるかをブレークポイントを使用して確認すると、ループが終了した後にアダプタ リストにアダプタが 1 つしか含まれていないことに気付きます。 4000。
ループ中に中断し、DXGI_ADAPTER_DESC2
各アダプターの構造を確認すると、取得したのは確かに GT 650M であることがわかりました。これは、統合グラフィックスがそれ自体をソフトウェア アダプターとして識別していることを意味します。
これ自体はもっともらしいですが、Ivy Bridge のダイ (私が持っているもの) の写真を見ると、Intel 自身が次のように定義する「プロセッサ グラフィックス」として封鎖された大きな領域が表示されます。プロセッサ パッケージに物理的に含まれているか、プロセッサ シリコンに統合されているグラフィックスに変換します。」それは私に「ハードウェアアダプター」と叫ぶだけです。
上記のコード ブロックを削除すると、確かにリストに 2 つのアダプターが表示されますが、2 つ目のアダプターはそれ自体を"Microsoft Basic Render Driver"として識別し、ベンダー ID を提供し0x1414
ます0x8086
。このリストには、 の所有者についても言及されていません0x1414
。
さらに混乱を招くのは、インテル HD グラフィックス コントロール パネルのインフォメーション センターを確認すると、ベンダー ID が0x8086
!
誰もが尋ねる前に: はい、私のドライバーは最新のはずです。これに気づいてすぐに更新しました。奇妙なことに、DxDiag は統合グラフィックスのドライバーの日付を間違って教えてくれますが、GT 650M については同じ (少し真実に近いですが) です。ディスクリート GPU ドライバーは WDDM 2.0 のものですが、統合グラフィックス ドライバーは WDDM 1.3 のものです。(アップデートに失敗したかも?)
directx - デスクトップ複製 API と切り替え可能なグラフィック
問題: IDXGIOutput1::DuplicateOutput メソッドを呼び出すと、切り替え可能なグラフィックスを備えたマシンで個別のグラフィックス コントローラーを使用してアプリケーションを実行すると、DXGI_ERROR_UNSUPPORTED が返されます。
この回答は、この問題に光を当てます。つまり、ディスクリート グラフィックスは画面の一部のみをレンダリングし、データを統合グラフィックス コントローラのフレームバッファに送信します。つまり、すべての出力は常に統合グラフィックス コントローラを経由します。これが、DuplicateOutput が DXGI_ERROR_UNSUPPORTED を返す理由のようです。
winapi ( EnumDisplayDevices 関数) とdirectx ( IDXGIFactory::EnumAdapters メソッド& IDXGIAdapter::EnumOutputs メソッド) を使用してすべての出力とそのビデオアダプターを取得し、切り替え可能なグラフィックス (Intel HD 4600 & NVIDIA 840M) を備えたマシンで比較するサンプルを作成しました。結果は次のとおりです。
私の比較がどれほど正しいかはわかりませんが、winapiは DISPLAY1 が Intel カードに属し、directxは DISPLAY1 が NVIDIA カードに属していると言っていることがわかります。1 つの解決策は、Intel カードの出力を複製することです (すべてがそれを通過するため) が、EnumOutputs はその出力を返しません。
現在、回避策があります。Duplication API を使用するアプリケーションは、統合グラフィックス コントローラを使用して常に実行してください。
質問: DuplicateOutput を、切り替え可能なグラフィックスを備えたラップトップのディスクリート グラフィックス コントローラーで動作させるにはどうすればよいですか? それとも Desktop Duplication API の制限ですか?
c++ - DXGI デスクトップ複製 API がリージョンを移動リージョンとして識別するのはいつですか?
DXGI Desktop Duplication API を使用してデスクトップ画面をキャプチャするプログラムがあります。
フレームをIDXGIOutputDuplication::AcquireNextFrame
取得し、デスクトップのフレームをフレームごとにキャプチャできます。
先に進むために、プログラムを最適化し、ダーティで移動した四角形を管理しようとします。API は、これらの情報を取得するためにIDXGIOutputDuplication::GetFrameDirtyRects
との両方を提供します。IDXGIOutputDuplication::GetFrameMoveRects
ただし、移動していると識別された四角形は決してないようです。ドキュメントには、移動された四角形は次のように記載されています。
オペレーティング システムが同じイメージ内の別の場所に移動したデスクトップ イメージ内のピクセルの四角形
これは正確にはどういう意味ですか? DXGI は、画面の任意の部分が移動されたことを識別できますか? それとも、これは移動中のデスクトップ ウィンドウにのみ適用されますか?
c++ - ネットワーク経由で送信される ID3D11Texture2D データの取得
Microsoft から親切に提供されたデスクトップ複製 API サンプルを変更して、画面をキャプチャし、ネットワーク経由でアプリケーションに更新を送信します。実際にデータを送信する方法を知っています。私の問題は、ID3D11Texture2D オブジェクトからデータを取得することです。
この時点で、画面の更新は にあると思いますm_AcquiredDesktopImage
。このデータを有線で (できるだけ効率的に) 送信する必要があります。
この答えは正しい方向に進んでいるようですが、私は Windows プログラミングが初めてなので、追加のヘルプが必要です。
これは私が想像できる唯一の解決策ですIDXGIObject::GetPrivateData
dxgi - 深度ステンシル バッファー リソースへのシェーダー リソース ビューに使用する形式はどれですか?
深度ステンシル バッファー リソースは、DXGI_FORMAT_D24_UNORM_S8_UINT
format として定義されます。
そのリソースにシェーダー リソース ビュー (SRV) を作成するには、ビュー形式を次のように記述する必要があると想定していました。
DXGI_FORMAT_R24_UNORM_X8_TYPELESS
赤のチャネルが深度値にアクセスする場所DXGI_FORMAT_R24G8_TYPELESS
赤のチャネルは深度にアクセスし、緑のチャネルはステンシル値にアクセスします
ただし、そのような SRV の作成は次のエラーで失敗します。
D3D12 エラー: ID3D12Device::CreateShaderResourceView: リソース形式 D24_UNORM_S8_UINT の場合、D3D ビューを作成するときに、ビューの形式名を R24_UNORM_X8_TYPELESS にすることはできません。リソース (またはその一部) がシェーダーにどのように表示されるかを決定する、このリソース形式の有効なビュー形式名のセットについては、ドキュメントを参照してください。[ STATE_CREATION エラー #28: CREATESHADERRESOURCEVIEW_INVALIDFORMAT]
API ドキュメントを調べると、次の情報が得られました。
リソースを表示する場合、リソース ビューの説明では、リソース形式と互換性のある型付き形式を指定する必要があります。つまり、名前に _TYPELESS を含む形式を使用してリソース ビューの説明を作成することはできません。ただし、ビューの型付き形式を指定することで、型のないリソースを表示できます。
型のない形式が許可されない理由と、代わりにどの形式を使用すればよいか、よくわかりません。
windows - Desktop Duplication API を使用してログオン画面とロック画面をキャプチャする
Windows 10 は Mirror ドライバーをサポートしていないため、Desktop Duplication API を使用して常にコンソールをキャプチャするにはどうすればよいですか? つまり、ログオン ウィンドウから開始し、次にユーザーのデスクトップ (ユーザーのログイン後) とロック画面をキャプチャします。
directx - DXGI_FORMAT を bpp に変換する
列挙せずに (ビット/ピクセル) 値に変換するDXGI_FORMAT
にはどうすればよいですか? bpp
(形式を参照)
例えば: