Equalizer中的映像擷取與合成

來源:互聯網
上載者:User

    作為一個並行渲染架構,Equalizer支援多種形式的映像合成,這之中包括多種顏色格式,像素格式下的幀緩衝資料擷取與傳輸,基於GPU或CPU的映像合成處理。其基本流程可以概括為,各個圖形繪製用戶端在完成一幀映像產生後,將幀緩衝資料從GPU讀回到系統記憶體,經過打包後發送給伺服器,由伺服器將同一幀映像進行合成後輸出。

        映像擷取中的流程入所示:


        映像的擷取從圖形繪製用戶端的eq::channel開始,它在接收到來自伺服器的FrameReadBack訊息後,訊息響應系統調用Channel::_reqFrameReadback( eqNet::Command& command ),後者調用void Channel::frameReadback( const uint32_t frameID )執行真正的幀緩衝資料讀回操作。 

        每個eq::Channel有一個_outputFrame列表用於儲存讀回到系統記憶體後並將要輸出的幀資料,通過遍曆這個列表,調用每個Frame的Frame::startReadback()函數進行幀快取資料的拷貝。 eq::Frame類用於儲存幀資料的參數並提供操作介面,而實際的幀資料則儲存在FrameData類及其下的Image類中。每個Image對象表示一組像素資料,可以包括顏色或深度資料,同時Image類負責真正的幀緩衝拷貝,目前eq採用的是glReadPixel。 

        映像的合成過程與映像的擷取類似,都是通過用戶端的eq::Channel對象響應訊息開始的,並且都是通過Image對象儲存和管理像素資料。差別在於合成過程中採用一個獨立的Compositor類來完成合成任務的操作,其中既提供了不同類型的合成方式,也提供了採用CPU或GPU進行合成的選擇。 

        此外,在映像合成時會有多種操作方式,例如CPU合成,基於簡單的顏色緩衝的2D合成,基於深度或透明的DB合成,以及通過glsl shader實現的映像合成。 
對延期著色的G-BUFFER映像合成的考慮

    要將Equalizer擴充以支援Deferred Shading,需要每個像素佔用16位元組,而正常的sort-first情況下,每個像素只需要4位元組。這時為了擷取像素資料,並進行傳輸、合成,需要對eq::Image內部的很多函數進行修改。 

    首先,eq::Image中的像素格式只有兩類,即FRAME_COLOR與FRAME_DEPTH,前者為BGRA格式,且每個通道為unsigned byte類型;後者為一個float類型浮點數。可見,這兩種像素格式都不適合儲存DS所需要的fat texture資料。 

    可以考慮的像素格式為BGRA格式,但是每個通道都採用float類型浮點數,這樣每個像素佔用16位元組。當然在使用時不能直接對各個通道賦數值,而應當對16位元組的資料通過按位與操作賦值。這就要求在現有的兩類像素格式外提供第三種,可以命名為FRAME_FATTEXTURE,這需要在frame.h檔案中進行相應的修改,並且需要在eqc檔案的解析過程中擷取該設定。 


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.