d3d nv12 texture 是由 R8 和 R8G8 两个平面组成的, 怎么把一个 R8G8 的 ID3D11Texture2D 的数据渲染到 NV12 的 uv 部分

2023-08-28 11:43:41 +08:00
 sbeasy

根据这个连接 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();
731 次点击
所在节点    程序员
2 条回复
noErr
2023-08-28 15:43:33 +08:00
在同一个 NV12 上创建两个 SRV ,不同格式的一个 R8,一个 R8G8 ?
sbeasy
2023-08-28 22:04:39 +08:00
@noErr 然后通过这两个 SRV, 获取对应的 R8, R8G8 的 Texture, 注册到 cuda 上, 然后拷贝到这两个 Texture 里? 听起来靠谱

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/968816

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX