`
igp92igp
  • 浏览: 16557 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用D3D渲染YUV视频数据

 
阅读更多

使用D3D渲染YUV视频数据
2010年08月19日
  源代码下载      源代码更新  
  在PC机上,对于YUV格式的视频如YV12,YUY2等的显示方法,一般是采用DIRECTDRAW,使用显卡的OVERLAY表面显示。OVERLAY技术主要是为了解决在PC上播放VCD而在显卡上实现的一个基于硬件的技术。OVERLAY的出现,很好的解决了在PC上播放VCD所遇到的困难。早期PC处理能力有限,播放VCD时,不但要做视频解码工作,还需要做YUV到RGB的颜色空间转换,软件实现非常耗费资源,于是,YUV OVERLAY表面出现了,颜色空间转换被转移到显卡上去实现,显卡做这些工作是具有天生优势的。 
  随着显卡技术的发展,OVERLAY的局限性也越来越充分的暴露出来。一般显卡只支持一个OVERLAY表面,用OVERLAY实现多画面比较困难,视频和文本的叠加也有困难,当然,要实现一些特效就更难了。更重要的是,OVERLAY技术在显卡上是属于2D模块,在高品质3D游戏的推动下,现在的显卡的功能和性能,主要体现在3D模块上,厂商投入最大的,也是在GPU的3D模块上。OVERLAY技术无法利用和发挥显卡GPU的3D性能。微软早就停止了对DIRECTDRAW的支持,鼓励开发人员转向DIRECT3D,所以OVERLAY也无法使用新的API。 
  早期的3D渲染,主要是使用CPU做的,显卡做的较少。后来,显卡GPU的处理能力越来越强,承担的3D渲染功能也越来越多,开始使用的是固定渲染管线,也就是说所有的渲染算法都是显卡内置的,我们只能组合使用这些算法。现在的显卡采用的都是可编程的渲染管线,也就是说我们可以编写自己的渲染算法,下载到显卡上去执行,替换固定渲染管线算法,灵活性大大提高。随着GPU效能的提高,显卡在图像处理、视频处理、科学计算等领域得到了广泛的应用。 
  使用D3D渲染YUV视频,可以采用D3D SURFACE渲染,也可以采用D3D纹理来渲染。SURFACE渲染比较简单,但功能限制较多,下面我们只讨论D3D纹理视频渲染。纹理视频渲染,就是把视频数据填充到二维纹理中,结合我们自己写的一段像素Shader代码,送到显卡的GPU渲染管线中去渲染。 
  以下假设读者了解所讨论的视频格式细节。 
  对于YV12视频数据,可以创建三个纹理,分别填充Y、U、V视频数据。对于缺失的U、V采样点,我们可以利用显卡内置的双线性滤波算法插值出来,这是简单的方法。当然,也可以采用更好的图像插值算法,以达到更高的图像质量,这需要我们通过Shader实现我们的插值算法,然后分别把U、V渲染到纹理,实现更好的插值。相对与双线性滤波,缺点是复杂更度高,效率低。U、V插值后,视频数据从YUV420转换为YUV444,然后做颜色空间转换,从YUV444转换为RGB32,转换的Shader代码很简单,就是一个矩阵乘法运算。对于I420数据,就是把YV12数据的U、V数据在内存中的位置对调,其他处理和YV12一样。 
  NV12格式,Y平面和YV12一样,UV部分是打包格式。所以UV部分需要单独处理,先把UV部分填充到一个纹理中,然后对UV纹理做两次简单的渲染到纹理,从而把U、V数据分别渲染到两个纹理。经过这样的处理,我们得到的数据就和YV12的数据一样了,接下来的处理就可以参照YV12的处理流程和方法了。 
  对于打包格式的数据YUY2,渲染时需要插值出缺失的U、V采样。YUY2在只在奇数像素上缺失U、V采样,这样处理的时候需要区分奇偶像素,对于偶数像素,不需要做U、V插值,直接做颜色空间转换。对于奇数像素,需要利用相邻的U、V采样做插值,可以采用Catmull-Rom插值算法或者线性插值算法。插值后,就可以做颜色空间转换。UYVY的做法和YUY2类似。 
  对于RGB格式,我所使用的NVIDIA GeForce 9800 GT显卡支持RGB32,RGB555,RGB565,不支持RGB24。所以对于RGB24,需要在Shader代码中分别取出R、G、B,再组成RGB32输出即可。RGB32,RGB555,RGB565不需要额外处理,可以直接渲染。 
  对于平面文本叠加,采用了微软提供的CD3DFont类,但这个类不支持中文,我在这个类的基础上做了一些修改,实现了一个支持中文的文本叠加类。这两个类互相配合,可以高效地实现平面文本叠加。 
  以上所讨论的内容,均使用Direct3D9.0c进行了验证测试。对OpenGL了解不多,但我想这些方法对于OpenGL应该同样适用,毕竟这两个3D架构在PC上实现的功能是相近的。 
  使用3D渲染平面视频,可以实现多种特效,像多画面、画中画、文本叠加、缩放,都很容易实现,性能也很好。如果结合其他3D技术,还可以做出很炫很酷的特效,就看我们的想象力了。
分享到:
评论

相关推荐

    C# wpf 使用d3d渲染yuv视频数据

    在wpf中可以使用hwnd渲染视频,但是有一个缺点,和wpf的控件不...为了解决这一问题,找到了一种可以和wpf绘制兼容的视频渲染方式,使用d3d渲染。原文链接:https://blog.csdn.net/u013113678/article/details/121296452

    D3D11直接渲染YUV

    采取三纹理方式使D3D可以直接渲染YUV数据

    Qt使用SDL2\D3D渲染YUV420p

    Qt使用SDL2\D3D渲染YUV420p

    C# wpf 使用WriteableBitmap渲染视频

    通过《C# wpf 使用d3d渲染yuv视频数据》我们实现了在Image控件中显示视频,解决了控件绘制不兼容问题。但如果有时候不想依赖D3D时,还有一种方案实现视频的渲染,使用wpf的WriteableBitmap,WriteableBitmap的祖先...

    d3d(texture)渲染YUV420

    采用d3d的texture渲染YUV420,使用了shader

    D3D 纯软件实现部分渲染过程

    采用软件的方式实现3D PipeLine中的空间转换和光栅化操作。 光照和贴图的实现 待续。。。

    基于D3D的YV12视频渲染

    基于D3D的YUV视频显示源代码,可以同时支持YV12、I420、NV12、YUY2、UYVY、RGB24、RGB32、RGB555、RGB565格式。支持半透明文本叠加。Windows XP SP2 DXSDK9.0c 9800GT测试通过。

    D3D三层Texture纹理经像素着色器实现渲染YUV420P

    D3D三层Texture纹理经像素着色器实现渲染YUV420P全工程源码,VS2013编译通过,修改成VS2008也可编译通过。运行前确保安装了DirectX9.

    D3D三层Texture纹理经像素着色器实现渲染YUV420P 第二版

    D3D三层Texture纹理经像素着色器实现渲染YUV420P全工程源码,VS2013编译通过。修正了画质问题。运行前确保安装了DirectX9.

    D3D11YUVRendering.rar

    使用D3D11接口API以三纹理方式高效渲染显示YUV格式的视频数据

    WPF D3D demo

    WPF 用D3D渲染 YUV http://blog.csdn.net/yangyy9611/article/details/17464133

    Flutter Windows通过嵌入Native窗口实现渲染视频

    如果能使用win32窗口,直接通过句柄渲染,那就可以达到与原生Windows渲染使用一致的效果,可以使用sdl渲染yuv,以及dxva2解码后d3d9表面直接渲染到窗口全程在gpu上操作。本文将介绍如何在flutter程序嵌入win32窗口...

    WPF下YUV播放的D3D解决方案

    在视频媒体播放,监控系统的构建当中,经常会涉及到YUV数据的显示问题。一般的播放控件以及SDK都是通过使用Window句柄,利用DirectDraw直接在窗口上渲染。但是,如果用户界面是使用WPF开发的时候,通常只能通过...

    d3d9_zoom.rar

    c++语言,d3d9 yuv420p渲染 ,电子放大缩小,类似zoom功能 只有源码,需要自己配d3d9依赖库环境,用法见txt文档

    direct3d的贴图代码

    但在对d3d初始化时,使用yuv之外的格式好象都不成功 2. 如何向表面上写字? 3. 使用渲染如何做?我现在使用贴图的方式(我这种提法没有问题吧?)。渲染和贴图哪个效率高一些? <br>有解决问题的,请给我留言...

    DirectX12(D3D12)基础教程(七)——渲染到纹理、正交投影、UI渲染基础-附件资源

    DirectX12(D3D12)基础教程(七)——渲染到纹理、正交投影、UI渲染基础-附件资源

    avplayer源代码

    在这个模块中, 实现了3套视频渲染输出d3d, ddraw, opengl这些方式(还有gdi方式渲染没有添加到video_out.h中). 5. avplayer 是一个使用avcore实现一个简单播放器的示范, 如果要创建一个播放器, 只需要avplayer.h, ...

Global site tag (gtag.js) - Google Analytics