最终发现VLC的代码里,创建Pool的纹理数组时,D3D11_TEXTURE2D_DESC的
ArraySize里面递入了外界的pool_size的值。而我为了照顾VLC剥离代码的流程,完整保留了代码的参数,并且想当然的使用ffmpeg解码的纹理里面的ArraySize值递进去指定这个纹理的ArraySize,这个纹理在渲染时就会被理解为一个纹理数组序列的1帧。
原来是自己搞晕头了,以前拷贝其实成功的,但是纹理并不是一个序列的一帧。这里其实我只需要一个纹理做转换而已。把ArraySize参数值改成固定的1,只创建1个带绑定属性的纹理,而不是创建一个纹理序列。ffmpeg解码后不带绑定属性纹理,通过CopySubresourceRegion拷贝过来,然后套用VLC的显示流程代码,创建ID3D11ShaderResourceView并进行三维渲染。这次,在球体三维模型上顺利显示出了视频画面。
自此,走了一大圈弯路,dx9的dxva2和dx11的d3d11va的硬解码和d3d11的三维纹理渲染显示都顺利熟悉了一遍。
上面说了一大堆废话,权做记录下最近的工作而已。感谢你看到这里,想必也是有需求。
没有直接放源码,属实是几个类代码量有点大,这里没法贴的。再加上源代码本身就参考摘抄自VLC和FFMPEG,C语言功底好,做事细致点,完全可以自己剥离。有问题可以给我站内信息讨论。有需要,全景播放器的整个代码也可以直接找我要,只是无责任不讲解哈。o( ̄▽ ̄)d