首页> 中国专利> 一种GPU上针对延迟着色反走样绘制的优化方法

一种GPU上针对延迟着色反走样绘制的优化方法

摘要

本发明公开了一种GPU上针对延迟着色反走样绘制的优化方法。本方法为:1)在几何绘制阶段中,将三维场景中的三维图元变换到屏幕空间执行光栅化操作以及深度测试操作,形成与屏幕空间像素位置对应的多个离屏缓冲区;2)绘制与屏幕等大的多边形并使得多边形在光栅化过程中填充整个屏幕,在像素处理器中首先对所有不需要多重采样处理的像素计算光照,丢弃每一需要多重采样处理的像素并记录该像素的位置;3)计算2)中记录的像素的光照;4)将2)计算的单采样像素的光照和3)计算的多重采样像素的光照进行合成,得到该三维场景的光照绘制结果。本发明提升了整个绘制中光照计算的效率。

著录项

  • 公开/公告号CN106846452A

    专利类型发明专利

  • 公开/公告日2017-06-13

    原文格式PDF

  • 申请/专利权人 北京大学;

    申请/专利号CN201611204279.0

  • 发明设计人 李胜;徐泽骅;汪国平;

    申请日2016-12-23

  • 分类号G06T15/50;

  • 代理机构北京君尚知识产权代理事务所(普通合伙);

  • 代理人司立彬

  • 地址 100871 北京市海淀区颐和园路5号北京大学

  • 入库时间 2023-06-19 02:31:39

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-12-03

    授权

    授权

  • 2017-07-07

    实质审查的生效 IPC(主分类):G06T15/50 申请日:20161223

    实质审查的生效

  • 2017-06-13

    公开

    公开

说明书

技术领域

本发明涉及一种GPU上针对延迟着色反走样绘制的优化方法,属于计算机软件技术、计算机图形学、虚拟现实技术领域。

背景技术

延迟着色技术是为了解决正向绘制方法中大量的重复像素计算而发展出来的一项技术,它的核心思想是将三维图元的光栅化操作和光照计算分离。该方法分为两个阶段,几何绘制阶段和光照计算阶段。

在几何绘制阶段中,场景中的三维图元(或称为三维几何图元,含多边形、参数表面等)经过正常的模型视图变换和投影变换到屏幕空间执行光栅化操作以及深度测试操作,但是在光栅化之后形成的像素处理过程中(即像素着色器或者片元着色器)不执行光照计算,而只是将光照计算用到的所有参数—如位置、法向、材质等信息—记录在若干离屏缓冲区中。这一组离屏缓冲区称为“几何缓冲区”(G-Buffer)。几何绘制阶段结束后,几何缓冲区中每个像素存储了该像素上离视点最近的(即最终可见的)三维图元的光照参数。

第二步光照计算阶段对几何缓冲区的每一个像素进行光照计算,将光照计算结果输出到帧缓冲并在显示设备上显示或者将结果输出其它离屏缓冲区上,这一步得到真正的具有颜色属性的绘制结果。

走样(aliasing)现象泛指一切由于采样率低于信号的分辨率而导致的显示效果失真现象。多重采样技术主要解决的是在由于显示设备的像素分辨率不足导致的多边形边缘产生锯齿的走样问题,因此也称为多重采样抗锯齿技术。该技术不仅可以处理单个多边形(含三角形、四边形等多边形)光栅化产生的边缘锯齿,也可以处理多个多边形彼此相交时在交线处产生的锯齿。

该技术与超级采样技术相似,通过提高像素分辨率,即屏幕空间的空间采样分辨率来实现抗锯齿的目的。无论是超级采样还是多重采样,每一个像素通常会根据模板产生多个采样点(也就是一个像素包含多个采样点),但是与超级采样不同的是,多重采样在光栅化阶段,对每个多边形覆盖到的每个像素只产生一份像素数据(传统上也称颜色数据),多重采样中只有深度信息和覆盖率信息需要每个采样点分别计算。这样可以减少大量透视插值操作,也可以大大减少像素着色器的执行次数,对计算资源的消耗与超级采样相比大大降低。当然,由于屏幕缓冲区的大小和需要执行的深度测试、模版测试和混合(blend)操作的数量仍然没有减 少,该方法对于GPU的像素输出单元(ROP unit)的压力仍然较大。

多重采样使用比超级采样少得多的计算量,达到了非常接近的绘制效果,至今仍然是三维实时绘制应用程序中使用最为广泛的抗锯齿算法。当然多重采样也并非完全没有缺陷,如果需要在像素着色器中输出深度,那么多重采样的深度插值就会失效,在多边形交线处会没有抗锯齿效果。

如果在延迟着色技术中进行反走样(以多重采样为例),则延迟着色最核心的光照计算阶段在GPU的像素着色器(或者称为片元着色器)中执行流程可以表示为下列伪代码:

在该流程中,首先通过纹理查找获得当前像素是否需要进行多重反走样的标记,然后根据该标记的值分别进行处理:如果当前像素需要进行反走样,则依照反走样采样点的数目进行分别采样并将个采样点光照计算的结果进行融合处理以获得最终该像素的光照和颜色;如果不需要进行反走样,则直接计算出该像素点的光照和颜色。

实际实验表明,按照该通用流程实现的系统执行效率并不高。即使屏幕上需要执行多重采样光照计算的像素只占极小的比例,光照计算阶段耗费的时间也比不使用多重采样的情况长很多,在表1中所示的简单方法即为上述方法所实现的结果。

发明内容

针对现有延迟着色绘制中进行反走样方法中存在的效率低的关键问题,本发明的目的在于提供一种GPU上针对延迟着色反走样绘制的优化方法。

本发明的技术方案为:

一种GPU上针对延迟着色反走样绘制的优化方法,其步骤为:

1)在几何绘制阶段中,将三维场景中的三维图元变换到屏幕空间执行光栅化操作以及深 度测试操作,形成与屏幕空间像素位置对应的多个离屏缓冲区;然后将每个离屏缓冲区与纹理对象绑定,得到纹理数据;

2)绘制与屏幕等大的多边形并使得多边形在光栅化过程中填充整个屏幕,在像素处理器中首先对所有不需要多重采样处理的像素计算光照,丢弃需要多重采样处理的像素并记录该像素的位置;

3)计算步骤2)中记录的像素的光照;

4)将步骤2)计算的单采样像素的光照和步骤3)计算的多重采样像素的光照进行合成,得到该三维场景的光照绘制结果。

进一步的,在步骤3)中,计算步骤2)中记录的像素的光照的方法为:使用计算着色器计算每一多重采样像素的颜色,在计算着色器中直接将像素颜色存储到纹理图像的对应位置。

进一步的,所述计算着色器为每一像素分配一个线程来计算该像素的光照;其中,该线程依照反走样采样点的数目进行分别采样,并对采样点的光照进行计算,然后在该线程内将该像素所包含的多个采样点的光照结果进行融合处理以获得该像素点最终的光照和颜色。

进一步的,所述着色器为每个像素的每一采样点分别分配一线程,然后并行执行所分配的线程进行光照计算,最后将多个线程的光照计算结果按照对应关系融合到所属的像素中,得到该像素的光照和颜色。

进一步的,在几何绘制阶段,为每个像素设置一个标记,标记该像素是否进行多重采样光照计算;步骤2)中,像素处理器根据是该标记判断像素是否进行多重采样光照计算。

进一步的,在步骤3)中,计算步骤2)中记录的像素的光照的可选方法为:根据记录的每个需要多重采样的像素位置,在该位置重新绘制为一个点图元,该点图元光栅化成为一个像素并触发形成一个线程,在该线程中对该像素进行多重采样的光照计算。

与现有技术相比,本发明的积极效果为:

实验结果表明,本发明所提出的多种方法和手段可以不同程度地提升整个绘制中光照计算的效率,最低也有50%性能的提升,最高可以达到150%以上的性能提升。

附图说明

图1为本发明的方法流程图;

图2为典型场景中的多重采样效果图;

(a)需要执行多重采样的像素;(b)受到多重采样影响的区块。

具体实施方式

本发明着重解决了在延迟着色方法中执行反走样效率低下的问题,通过对流程的优化提升了延迟着色反走样绘制的效率。本发明首先分析出了通用延迟着色反走样方法效率低下的两个原因:执行路径分离(branch divergence)和光栅化管线阻塞。然后采用两步法解决,第一步首先填充整个屏幕,对所有不需要多重采样处理的像素计算光照,丢弃所有需要多重采样处理的像素并把这些像素的坐标记录下来,第二步再处理这些需要多重采样的像素。在第二步中,本发明还设计了多种可行的策略和实现的手段。

通用延迟着色反走样方法效率低下的两个原因:

1)执行路径分离

现代GPU一般都采用线程编组的执行策略,例如NVIDIA的GPU将32个线程编为一组,称为一个warp,AMD的GPU将64个线程编为一组,称为一个wavefront。同一组内的所有线程总是执行同一条指令。如果在着色器程序执行过程中发生了分支,同一个编组内部的某些线程需要执行分支的一侧,另一些线程需要执行分支的另一侧,那么GPU必须先执行一侧的指令,再执行另一侧的指令,总时间将是分支两侧的执行时间之和。

在光栅化阶段,在屏幕上相邻的像素一般被分到同一个线程编组中执行像素着色器。例如NVIDIA GPU会将屏幕划分为许多4×8像素大小的矩形,每个矩形中的像素对应的像素着色器实例编为一个warp。这就意味着在光照计算阶段,如果在4×8大小的矩形中哪怕只存在一个像素需要执行多重采样处理,整个矩形区域内所有32个像素的计算都会被拖慢。

一般而言对于一个场景,其中需要执行多重采样的像素并不多。但是如果将多重采样像素所在的4×8矩形区域中的所有像素都做上标记,可以看到会有大量像素的需要执行多重采样光照,会严重影响绘制效率。

图2(a)是本系统中的一个场景,其中需要执行多重采样的像素用纯黑色标出,可以看到这样的像素并不多。但是如果将多重采样像素所在的4×8矩形区域中的所有像素都做上标记,则结果如图2(b)所示,可以看到有大量像素(形成多重采样像素的区块)的计算过程由于受到多重采样光照计算影响而被减慢了。

2)光栅化管线阻塞

同一个场景在GT 640GPU(包含一个流处理器(测试时使用的这个子型号与大多数GT 640不同,一般的GT 640包含两个流处理器),192个浮点计算单元,线程并发数2048个。)上执行延迟着色光照计算,如果某一时间段内处理的所有像素都不需要执行多重采样光照,那么这个时间段内几乎所有逻辑核心都处于工作状态;如果有某个像素正在进行多重采样光 照计算,那么对应的时间段内经常会有许多逻辑核心没有分配到处理任务,处于闲置状态。

根据GPU硬件光栅化引擎的设计原理可知,是像素着色器的执行时间过长导致光栅化管线出现了阻塞,影响了新像素的顺利生成,导致GPU核心利用率降低。

本发明的效率优化方法

既然耗时较长的多重采样光照计算会影响GPU的整体运行效率,本发明的解决方案是将延迟着色的反走样方法的光照计算过程拆成两步,将多重采样光照计算和普通光照计算分离开来。本发明的步骤如下:

1)在几何绘制阶段中,场景中的三维图元(或称为三维几何图元,含多边形、参数表面等)经过正常的模型视图变换和投影变换到屏幕空间执行光栅化操作以及深度测试操作,形成与屏幕空间像素位置对应的多个离屏缓冲区(即一个像素位置与多个离屏缓冲区中该位置的元素对应,都属于该位置像素所包含的信息),这些离屏缓冲区中保存了后续阶段光照计算需要用到的所有参数—如位置、法向、材质等信息。同时,每个像素都带有一个标记,标记该像素是否进行多重采样光照计算,这些标记形成了一个标记缓冲区。在实现时,每个离屏缓冲区均可与纹理对象绑定,从而变成纹理数据,可作为后续纹理采样数据使用。

2)绘制与屏幕等大的多边形并使得多边形在光栅化过程中填充整个屏幕,在像素处理器中根据是否进行多重采样光照计算的标记进行判断(判断的方式可采用纹理采样获得其标记值的方式),对所有不需要多重采样处理的像素(即非多重采样像素)进行计算光照,而丢弃所有需要多重采样处理的像素(所谓丢弃一个像素,是指像素处理器中的一个操作,它可以终止处理该像素的线程,而不再执行该线程后续的所定义的操作)并把这些像素的坐标(位置)记录下来。

3)对所有需要进行多重采样光照计算的像素进行处理,该步处理有如下多种不同的方法可以实现。

3.1)最简单的实现方法是根据步骤2)所记录的需要多重采样的像素位置,重新在每个位置绘制一个点图元(如采用OpenGL中的GL_POINT定义实现),利用GPU的光栅化功能填充这些像素,而每一个点图元光栅化成为一个像素并触发形成片元处理器(或者像素处理器,Fragment Processor/Pixel processor)上的一个线程,在该线程中可以进行多重采样的光照计算,也就是依照反走样采样点的数目进行分别采样并将采样点的光照进行计算,最后将一个像素所包含的多个采样点的光照结果进行融合处理以获得最终该像素点的光照和颜色,该方法的结果对应表1中的点绘制方法。这种方法的优点是实现简单,基本可以复用之前未作优化的着色器程序代码。其缺点是GPU的光栅化引擎在处理点类型的图元时仍然会遵循把同一个区域内的多个像素分到一个线程组中的策略,因此GPU的利用率还是不够高。

3.2)较优的方法是在执行完步骤2之后使用计算着色器计算多重采样像素的颜色,不需再借助光栅化操作填充像素,而是在计算着色器(Compute Shader)程序中进行光照计算并直接将像素颜色存储到纹理图像的对应位置。相对于光栅化的方法,这种方法对着色器程序的改动较大,而且需要自己编写代码才能实现像素混合(blend)操作,光栅化时自动进行的不同色彩模式之前的转换(如sRGB与RGB的转换)也必须在着色器程序中实现,总体来说实现较为复杂。但是使用计算着色器可以自由调整线程组的分配方式,因此这种方法是所有方法中GPU利用率最高的。

在计算着色器中进行多重采样光照计算的方式又分为两种:每个线程处理一个像素中所有的采样点计算光照(对应表1中的每线程一个像素),或者每个线程处理一个采样点计算光照(对应表1中的每线程一个采样点)。前一种方式中,在每一个线程内部依照反走样采样点的数目进行分别采样,并对采样点的光照进行计算,最后在一个线程内将一个像素所包含的多个采样点的光照结果进行融合处理以获得最终该像素点的光照和颜色。后一种方式中,在每一个线程对应一个采样点,并计算该采样点的光照,多个采样点的光照计算以线程并行的方式并行执行,最后将多个线程的光照计算结果按照对应关系融合到所隶属的一个像素中,以获得最终该像素的光照和颜色。后一种方法需要启动的线程数量较大,但是每一个线程需要执行的计算量更小,在利用GPU的并行计算能力上更有优势(对应表1中的每线程一个采样点)。另外,使用后一种方法时每个warp内有多个线程处理同一个像素中不同的采样点,单个warp需要读取的像素数据较少,在空间上的分布也相对较为集中,有助于提高warp内部的访存局部性。

4)将非多重采样像素的光照计算结果与多重采样像素的光照计算结果进行融合,合成最终的绘制结果并输出色彩图像。

表1给出了同一场景在NVIDIA GeForce GT640和GTX970两个型号的GPU上使用不同的多重采样处理算法所用的时间(单位为毫秒)。不难看出,在GTX970上,每个线程处理一个采样点的方法相比其他方法具有非常明显的性能优势。在16×MSAA的情况下,每个像素包含16个采样点,此时每个计算着色器线程处理一个像素的方法由于每个线程计算任务较重,访存局部性很差,效率甚至不如点绘制方法。只有每个线程处理一个采样点的方法始终保持了非常高的多重采样处理性能。

表1 不同多重采样处理方法的性能比较

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号