具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然所描述的实施例仅是本发明的一部分实施例,不是全部的实施例,基于本发明中的实施例,本领域普通技术人员在没有付出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明的反走样的改进方法是应用在图形渲染流水线的光栅化阶段,是可以不依赖GPU,独立能实现的渲染引擎。另外,因为光栅化阶段采用扫描线算法,所以要实现光栅化阶段的反走样,X,Y方向采样点采用规则的m*n的方式。目前根据需要采样点方式包括2X(1*2),4X(2*2),8X(2*4),16X(4*4),32X(4*8)等采样方式。如以8X为例,即X方向采用两个采样点,Y方向采用4个采样点。
本发明实施例一方面提供了一种图形渲染流水线中光栅化阶段反走样的改进方法,实施流程如图1所示,具体为:
步骤S1:准备反走样需要的颜色缓冲区和深度缓冲区并初始化。获取当前三角片三个顶点的数据,屏幕空间中的位置vPos,深度值fDepth,顶点光照颜色vColor,每层纹理的uv坐标vUV[8](最多八层纹理)。要实现反走样,将顶点位置vPos的X、Y分量分别乘以X,Y方向的反走样倍数m,n或者叫做采样方式,记为m*n。
步骤S2:计算三角片的包围盒,并且此包围盒的X方向边界是m的整数倍,Y方向边界是n的整数倍。
步骤S3:计算包围盒区域内的扫描线的起点终点位置和起点终点的深度值,上述起点终点位置和起点终点的深度值是通过三角片三个顶点的位置和深度值插值得到的。
步骤S4:以m*n的小区域为单位,对在三角片内部且深度值大于深度缓冲区中的深度值的像素的x,y方向的权重值(区域内的相对位置)分别相加记为fSumX,fSumY,并将总的个数iCount加1,并标记这个像素为TRUE。其中fSumX,fSumY,iCount初始值都记为0。如果iCount为0则继续重复步骤S4,否则进行步骤S5。
步骤S5:根据步骤S4中得到的权重值将fSumX,fSumY除以总数iCount得到x,y方向的值,并计算相对于采样点小区域内的一个位置,此位置作为需要计算颜色的位置。
步骤S6:根据三角片顶点位置与上述计算的颜色的位置得到当前顶点的光照颜色和纹理坐标值后计算当前位置的颜色。
步骤S7:将计算得到的当前位置的颜色赋给S4中位于三角片内且深度值大于深度缓冲区中的深度值的像素。
步骤S8:按照上述方法对所有三角片都处理完之后,将颜色缓冲区缩小到原始大小,得到反走样的渲染结果。
本发明的实施方式通过在反走样处理之前先准备反走样所需的颜色缓冲区,计算采样点区域范围内的一个指定位置的颜色然后将此颜色值赋予区域范围内的子像素,然后对三角片进行光栅化处理并且在光栅化处理完成之后对颜色缓冲区缩小到原始大小的反走样改进方法可以提高在有纹理情况下的计算效率,更好的实现三维渲染引擎的反走样效果。
以下以采样点为8X为例并结合图2对本发明实施例一的图形渲染流水线中光栅化阶段反走样的改进方法进行更加详细的阐述,具体为:
步骤S1:将vPos的X,Y方向分别乘以反走样倍数即X方向乘以2,Y方向乘以4使颜色缓冲区和深度缓冲区存储的信息量是不用反走样时候的8倍。在光栅化阶段之前,准备反走样需要的颜色缓冲区和深度缓冲区并初始化。
步骤S2:计算三角片的最小包围盒,X方向边界是2的倍数,Y方向是4的倍数。
步骤S3:根据8X采样点计算包围盒区域内的扫描线的起点终点位置和起点终点的深度值,并且是通过三个顶点的位置和深度值插值得到的。
步骤S4:记fSumX,fSumY为0,iCount=0;本实施例的8X反走样以2*4的小区域为单位,通过3个扫描线的位置和深度值,具体可参见图3所示。判断这个区域内每个像素是否在三角片内,并且计算每个像素的深度值,进行深度检测(也就是与深度缓冲区中的深度值做比较,如大于这个值,表示离观察者近,未被遮挡)。如是,用将该像素的深度值替换深度缓冲区中的相应位置的深度值,并将此像素的X,Y方向的权重(相对于整个2*4区域的)加入fSumX,fSumY,并且iCount加1,并标记这个像素bFlag为TRUE。
步骤S5:如果iCount=0,继续计算下一个2*4小区域;否则进行步骤S6。
步骤S6:将fSumX,fSumY除以iCount,得到X,Y方向的值,并且是相对于小区域的位置值,根据小区域的位置,计算这个位置的绝对值,记为vTempPos。
步骤S7:计算当前位置的颜色。根据三角片三个顶点的位置及vTempPos的值,确定三角片三个顶点的权重,用三个顶点的颜色和纹理坐标值乘以相应顶点的权重并相加,得到当前位置vTempPos处的光照颜色和纹理坐标值(如有纹理)。光照颜色与纹理颜色进行混合,第一层纹理与光照颜色混合计算得到颜色值color,如果有第二层纹理,则与前面的颜色值color再做混合计算,依此类推,直到得到最终的颜色值。
步骤S8:将步骤7计算得到的颜色赋给2*4格内并且在三角片内部并且通过深度测试的子像素即步骤S4中标记为TRUE的像素进行颜色缓冲区的填充。
步骤S9:所有三角片都处理完之后,对颜色缓冲区缩小到原始大小即8个采样点颜色合成一个颜色,得到反走样的渲染效果。
本发明的实施方式通过在反走样处理之前先准备反走样所需的颜色缓冲区,计算采样点区域范围内的一个指定位置的颜色然后将此颜色值赋予区域范围内的子像素,然后对三角片进行光栅化处理并且在光栅化处理完成之后对颜色缓冲区缩小到原始大小的反走样改进方法可以提高在有纹理情况下的计算效率,并且对物体的边缘和相交边界有很好的处理效果,更好的实现三维渲染引擎的反走样效果。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可以通过软件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
以上所述,仅为本发明的一个最佳具体实施例,但本发明的特征并不局限于此,任何熟悉该项技术的人在本发明领域内,可轻易想到的变化或修饰,都应涵盖在以下本发明的申请专利范围中。