作為一個並行渲染架構,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檔案的解析過程中擷取該設定。