作为一个并行渲染框架,Equalizer支持多种形式的图像合成,这之中包括多种颜色格式,像素格式下的帧缓冲数据获取与传输,基于GPU或CPU的图像合成处理。其基本流程可以概括为,各个图形绘制客户端在完成一帧图像生成后,将帧缓冲数据从GPU读回到系统内存,经过打包后发送给服务器,由服务器将同一帧图像进行合成后输出。
图像获取中的流程入下图所示:
每个eq::Channel有一个_outputFrame列表用于保存读回到系统内存后并将要输出的帧数据,通过遍历这个列表,调用每个Frame的Frame::startReadback()函数进行帧缓存数据的拷贝。 eq::Frame类用于保存帧数据的参数并提供操作接口,而实际的帧数据则保存在FrameData类及其下的Image类中。每个Image对象表示一组像素数据,可以包括颜色或深度数据,同时Image类负责真正的帧缓存拷贝,目前eq采用的是glReadPixel。
图像的合成过程与图像的获取类似,都是通过客户端的eq::Channel对象响应消息开始的,并且都是通过Image对象保存和管理像素数据。差别在于合成过程中采用一个独立的Compositor类来完成合成任务的操作,其中既提供了不同类型的合成方式,也提供了采用CPU或GPU进行合成的选择。
要将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文件的解析过程中获取该设置。