顯示器如何顯示一個YUV422格式的圖形


記錄在開發過程中對知識點的一些理解:

在開發渲染程序的過程中,需要對視屏文件進行解碼解碼后特效文件的疊加,使用的技術是(FFmpeg+DirectX)

解碼出來的視屏數據格式是YUYV,使用DirectX的創建的紋理格式為RGBA,

(1):視屏的寬高分別為Width和Height,則視屏最后在顯卡中顯示為RGBA的緩存大小:Width*4*Height。

(2):FFmpeg解碼為YUYV格式的緩存大小為:Width*2*Height,因為每個像素采樣一個Y,每兩個像素采樣一個UV。那么則創建一個寬度為Width*2,高度為Height的DirectX紋理來存儲解碼后的YUYV數據,將此數據送入定點作色器和像素作色器進行采樣。其大概流程為:

  解碼后的YUYV數據 -> DirectX紋理數據 -> 作色器采樣(還原為2倍大小)-> 顯示器輸出顯示

  

  YUYV數據和RGBA紋理中的數據完全一樣,都是YUYVYUYVYUYV……的格式和大小,並沒有帶有真正的透明度信息(即YUYV分別對應RGBA,其實A存儲的為V信息),數據只有在進行采樣的時候送入頂點和像素作色器才被還原為原來的大小,在作色器中才有數據格式的變化,將YUV轉化為RGB,然后給A的透明度填充為固定值,不透明。

 (3):下面來分析采樣的方式:

  

  目的:將一個寬度只有顯示一半的紋理數據(YUYV)完整的顯示在顯示器上,即將一個大小為【W/2 * H】的YUV/RGBA紋理變化為一個大小為【w * H】的RGBA數據,並且顯示在顯示器上面

  分析:如何將一個大小不等於顯示屏寬度的圖像全屏完整的顯示出來呢?答案是:在橫向和縱向進行屏幕顯示分辨率的寬度個數次采樣,假如屏幕的分辨率是1920*1080,則將要顯示的圖像進行橫向1920次采樣,縱向1080次采樣。

  則for(int i = 0;i<1080;i++)

    {

      for(int j = 0; j< 1920; j++)

      {

        //Samplate 對需要輸出的原始圖形進行采樣,則每次采樣的位置為(src.i/1920*src.w)

        //假如原圖像的寬高為960*1080,則第一次C采樣的點位(0,0),第二次采樣的地位(0,0),第三次(1.0),第四次(1.0)

        //則紋理坐標為(0/960,0/1080)映射到(0/1920,0/1080)

        //則紋理坐標為(0/960,0/1080)映射到(1/1920,0/1080)    

        //則紋理坐標為(1/960,0/1080)映射到(2/1920,0/1080)

        //則紋理坐標為(1/960,0/1080)映射到(3/1920,0/1080)

      }

    }

  如下圖所示:

  其實作色器會在原始圖像中每個像素采樣兩次;每次采樣的紋理坐標為(i/1920,j),i為的范圍是【0-960】

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM