根据这个连接 https://forums.developer.nvidia.com/t/nvdec-decoded-frame-trying-a-zero-copy-to-nv12-d3d11-texture/123291 , 这种方法是可行的
目前做了这些工作, 但是不知道顶点着色器和像素着色器应该怎么写
//将 R8G8 上的数据拷贝到 NV12 Texture 的 UⅣ部分
//创建目的 NV12 Texture 上 Uv 部分的 RenderTargetView uvRTVD3D11_RENDER_TARGET_VIEw_DESC rtDesc;
rtDesc.Format = DXGI_FORMAT_R8G8_UNORM;
rtDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;rtDesc.Texture2D.Mipslice = ;
//D3D11 will map this render target view to the NV12 Chroma
plane(U/v Interleave Plane)
device->CreateRenderTargetView(nv12Texture.Get(),&rtDesc ,uvRTV.ReleaseAndGetAddress0f()));
//创建源 R8G8 Texture 上的 SHADER_RESOURCE_VIEw uvSRV
D3D11_SHADER_RESOURCE_VIEw_DESC srvDesc;
srvDesc.Format = DXGI_FORMAT_R8G8_UNORM;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;srvDesc.Texture2D.MipLevels = 1;
srvDesc.Texture2D.MostDetailedMip = 0;
device->CreateShaderResourceView(r8g8texture.Get(),&srvDesc ,uvSRV.ReleaseAndGetAddressOf()));
//将 uvSRV 绘制在 uvRTV
context_->0MSetRenderTargets(1 ,uvRTV.ReleaseAndGetAddressOf(),NULL);context_->VSSetShader(vertexShader.Get(),NULL ,0);
context_->PsSetShader( uvPixelShader.Get(),NULL,0);
context_->pssetShaderResources(0 ,1 ,uvSRV.GetAddressOf( ));context_->Draw(4 ,0);
context_->Flush();
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.