タグ付けされた質問 「directx-11」

1
DirectX11ピクセルシェーダーを使用したGPUでのDXGI_FORMAT_B8G8R8A8_UNORMからNV12への色変換
デスクトップ複製を使用してデスクトップをキャプチャし、Intel hardwareMFTを使用してそれをh264にエンコードするコードに取り組んでいます。エンコーダーは、入力としてNV12形式のみを受け入れます。DXGI_FORMAT_B8G8R8A8_UNORMからNV12へのコンバーター(https://github.com/NVIDIA/video-sdk-samples/blob/master/nvEncDXGIOutputDuplicationSample/Preproc.cpp)があり、DirectX VideoProcessorに基づいています。 問題は、特定のインテルグラフィックスハードウェアのVideoProcessorがDXGI_FORMAT_B8G8R8A8_UNORMからYUY2への変換のみをサポートし、NV12はサポートしないことです。GetVideoProcessorOutputFormatsを介してサポートされているフォーマットを列挙することで同じことを確認しました。VideoProcessor Bltはエラーなしで成功し、出力ビデオのフレームが少しピクセル化されているのを確認できましたが、よく見るとわかります。 おそらく、VideoProcessorは次のサポートされている出力形式(YUY2)にフェイルオーバーしただけで、入力が構成済みのNV12であると考えるエンコーダーに知らずにフィードしています。NV12とYUY2の間でバイトオーダーやサブサンプリングなどの違いがほとんどないため、フレームの障害や大きな破損はありません。また、NV12変換をサポートするハードウェアでピクセル化の問題はありません。 そこで、このコードに基づいたピクセルシェーダーを使用して色変換を行うことにしました(https://github.com/bavulapati/DXGICaptureDXColorSpaceConversionIntelEncode/blob/master/DXGICaptureDXColorSpaceConversionIntelEncode/DuplicationManager.cpp)。ピクセルシェーダーを機能させることができます。参照用にコード(https://codeshare.io/5PJjxP)もアップロードしました(可能な限り簡略化しています)。 これで、クロマとルマの2つのチャネル(ID3D11Texture2Dテクスチャ)が残りました。そして、2つの個別のチャネルを1つのID3D11Texture2Dテクスチャに効率的にパックして、同じものをエンコーダーに送ることができるかどうか、本当に混乱しています。YおよびUVチャネルをGPUの単一のID3D11Texture2Dに効率的にパックする方法はありますか?CPUベースのアプローチはコストが高く、可能な限り最高のフレームレートを提供できないため、私はCPUベースのアプローチにうんざりしています。実際、テクスチャをCPUにコピーすることすらしません。CPUとGPUの間でコピーをやり取りすることなく、GPUでそれを行う方法を考えています。 私はかなり長い間これを研究してきましたが、何の進歩もありませんでした。 /** * This method is incomplete. It's just a template of what I want to achieve. */ HRESULT CreateNV12TextureFromLumaAndChromaSurface(ID3D11Texture2D** pOutputTexture) { HRESULT hr = S_OK; try { //Copying from GPU to CPU. Bad :( m_pD3D11DeviceContext->CopyResource(m_CPUAccessibleLuminanceSurf, m_LuminanceSurf); D3D11_MAPPED_SUBRESOURCE resource; UINT subresource = …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.