论文部分内容阅读
Tile-Based体系架构以其独特的三维图形显示算法,在嵌入式图形处理器设计领域内占有重要地位[1]。其最显著特征是将屏幕分割为许多小块区域分别进行场景的绘制渲染。这种显示算法与传统的图形显示流水线并不相同,带来的最大优势是可以大幅度降低图形处理器对深度缓存的访存带宽需求[2]。当前嵌入式系统所能提供的系统带宽,在面对高性能高质量的应用需求时依然显得不足,而且访存操作被认为是嵌入式系统中功耗的主要来源之一[4],所以要在当前嵌入式图形显示系统中获得高质量、低功耗的设计,关键在于降低系统的带宽需求,即运算部件与内存之间的数据传递[3],而Tile-Based架构正适应了技术发展的现状。另一方面,Tile-Based架构使得延迟渲染技术(Deferred Rendering)成为很自然的选择[5]。通过延迟渲染技术的使用,可以减少不必要的纹理映射等计算,进一步降低系统带宽需求。所以在嵌入式图形处理器领域,Tile-Based体系架构被多家主流厂商所采用,例如Imagenation的PowerVR MBX、PowerVR SGX系列[6],ARM的Mali系列[5]等。但该体系结构也有其固有困难,需要仔细设计算法细节与中间数据结构才能获得正确的显示结果并发挥出其低带宽需求的优势。其中正确性保证需要解决的是Tile-Based架构与主流三维显示API标准,即与OpenGL[7]、OpenGL ES[8]、DirectX[9]等标准之间的兼容性问题;而低带宽需求则涉及高效的中间缓存内部数据结构设计。因此本人选择基于Tile-Based架构的嵌入式图形处理算法设计作为博士论文的主要研究课题,同时还涉及了一些高质量图形显示算法在嵌入式系统中的应用。本文所取得的成果主要有:1.依照传统3D API标准的顺序性语义模型,寻找其与Tile-Based架构之间的不兼容性特征。当前的两大3D API标准为Khronos group组织所维护的OpenGL、OpenGL ES以及Microsoft所推出的DirectX系列。它们的基本算法都基于立即渲染模式(Immediate Rendering Mode)[10],而编程模式则是遵从顺序性语义的流模型(Stream Programming Model)[11][12][13][14]。顺序性语义模型中所隐含的数据相关性[19]与CPU的指令集设计十分类似,即约定当前API的执行必须基于上一条API执行完成后的结果。而Tile-Based体系架构从本质上说是一种并行结构[1][15][16][17],每条API对系统所产生的影响并不能立即获得,所以会引发一系列的兼容性问题。本文从顺序性语义模型出发,分析OpenGL ES标准,并与Tile-Based基本结构相结合,获得Tile-Based架构与OpenGL ES标准之间的兼容性矛盾,例如Alpha test开启之后纹理映射操作对深度缓存(depth buffer)以及蒙板缓存(stencil buffer)更新的影响,即early z test[20][21]的结果一致性保证;帧缓存读取(framebuffer read)操作的数据相关解决方法;纹理的产生/删除(Texture generation/deletion)在Tile-Based结构下的实现方法;复杂场景的正确显示等。2.兼容OpenGL ES标准的高性能Tile-Based架构设计。针对之前分析获得的不兼容性问题,本文设计了一种基于Tile-Based架构的图形显示算法,并设计了高压缩率的中间缓存数据结构形式,保证了内存的高效利用。同时增加一块片内缓存visible buffer保存可见的片段(visible fragment)[7],以支持延迟渲染技术的实现,避免了传统延迟渲染中fragment对内存的写入操作[5],降低了绘制阶段对系统带宽的需求。3.高质量的空间异性纹理映射滤波算法设计。由于移动设备中单个像素的显示质量要求甚至要高于桌面系统[22],所以本文设计了一种空间异性纹理映射方法,实现对像素椭圆足迹的滤波近似,提高了纹理映射的质量,有效避免了传统空间同性纹理映射所带来的过滤波模糊现象。并且通过增加一块不大的查找表(<3KB),可以降低空间异性纹理映射所需执行的计算。在此基础上设计了一种查找模式,可以根据当前系统带宽情况进行质量与性能间的平衡,更灵活地适应移动平台应用环境。4.快速景深渲染方法。为了获得交互性的景深效果表现,本文提出了两种方法:一是利用深度权重分别模拟前后场景中的遮挡规则,而后通过融合缓存将前后场景累加获得景深效果图像。该方法能够避免传统快速扩散方法所带来的后场景向聚焦深度物体的渗透现象,并拥有传统快速扩散方法的交互性。另一种方法则是通过累加缓存算法获得镜头中不同视点下的场景图像与深度图像,再使用深度加权的快速扩散方法进行相应处理,最后累加获得景深表现。这种方法能够较好的改善前场景的景深扩散表现,效果好,但复杂度与资源消耗较前者为高。