一种混合式光线跟踪绘制方法及系统与流程

文档序号:23136802发布日期:2020-12-01 13:12阅读:119来源:国知局
一种混合式光线跟踪绘制方法及系统与流程

本申请涉及计算机图形学实时绘制领域,尤其涉及一种混合式光线跟踪绘制方法及系统。



背景技术:

光线跟踪和光栅化方法一直以来是图形学研究的两个重要领域,两者在绘制质量和绘制效率方面各有一定的优势。光线跟踪能够绘制出具有很高真实感的图像结果;而光栅化方法由于对gpu友好的特性,使得其长时间被用作实时绘制的主要绘制方法。光线跟踪由于其复杂的计算量和全局的空间连贯性,使其难以达到实时绘制的要求;而光栅化绘制方法本身就缺少对物体之间光能传播的计算过程,使得在全局光照效果的表现受到了影响,比如多次反射、折射等间接光照效果,导致其真实感表现能力不足。

虽然随着实时绘制技术的成熟与完善,针对光栅化绘制方法的这些缺陷,学术界和业界有提出类似预计算辐射度转换、屏幕空间反射等方法来拟合部分反射效果,但始终难以通用、完整的表现这些全局光照效果。同样地,透明、折射效果的实现,一直以来也是光栅化绘制方法难以处理的一个课题。传统次序独立的透明绘制方法需要损耗大量的计算力,且其实现的结果仍存在局限性。而这些问题对于光线跟踪绘制方法而言是十分容易处理的。

nvidia和微软在2018年的gdc大会上联手推出了针对实时光线跟踪real-timeraytracing的新框架。nvidia从硬件层面上推出了图灵架构的gpu并相应地发售了对应型号的gpurtx20系列。该架构全面支持实时光线跟踪技术,并专门为光线跟踪大量的求交运算做了硬件层面上的优化,为光线跟踪计算性能的提升奠定了硬件基础;微软则从软件架构上,为其directx12图形绘制应用程序编程接口新增了专门针对光线跟踪提出的新的光线跟踪绘制流水线,以及对应的应用程序编程接口dxrdirectxraytracing。由于dxr光线跟踪绘制接口是直接在directx12光栅化图形绘制接口上进行集成的,这实际上使得光线跟踪效果能够实时地混合原有的光栅化绘制效果,也推动了混合绘制方法的研究和应用。例如申请号为200680028930.1的专利提供的一种具有深度缓冲显示器的光线跟踪系统和方法。

虽然该实时光线跟踪软硬件框架对该领域的研究起到了巨大的推动作用,但由于其功能和性能还存在不足,其对实时光线跟踪的绘制仍存在较明显的限制,其中一个比较显著的问题便是每像素的光线采样数(samplesperpixel,spp)少的现状。当下的框架中,为了实现实时绘制的要求,光线跟踪在计算时,基本采用的是1~3spp占主导的情况,即每个像素发射光线的数量为1~3条,且光线的递归调用也常被限制为5~6次。这对于漫反射和一些复杂场景下的光照效果,如镜面反射、折射等的支持其实上仍然存在不小的影响。在现有硬件性能无法在短期内再次出现颠覆性的提升之前,如何把光线跟踪有限的计算资源,尽量多地集中用于这些更能体现其价值的地方,从而能够利用有限的计算资源获得更好的绘制质量,有机结合光栅化和光线跟踪两种技术的优势,是本申请所聚焦的问题。



技术实现要素:

针对现有技术的不足,本申请提出一种易扩展的混合光线跟踪绘制系统。将用光栅化可以实现的内容和获取的信息交给光栅化绘制流水线来处理,而把光线跟踪独有的绘制效果交给光线跟踪绘制流水线来进行,两者之间的信息可以共享,其输出结果也能够混合,从而组合发挥两者之间各自的优势,能够实时绘制出高质量的画面。

一种混合式光线跟踪绘制系统,包括:

光栅化模块,获取屏幕上每帧图像内各个像素的场景信息并进行光栅化;

光线跟踪调度模块,根据光栅化结果,计算当前帧每个像素进行光线跟踪的概率值;

光线跟踪模块,依据所述的概率值,对像素进行光线跟踪计算;

结果分析模块,根据当前帧计算出的光线跟踪结果,调整对应像素的概率值;

输出模块,用于在屏幕上显示绘制结果。

优选的,所述的场景信息包括几何、材质和光源,并保存在自定义的g-缓冲区中。

优选的,所述光线跟踪调度模块的运行算法如下:

在第一帧开始时,进行概率值初始化工作,将屏幕上的所有像素的光线跟踪概率值初始化为给定的初始值;

将根据上一帧获得的信息进行判断,估计间接光对绘制结果的影响比例,对概率值进行调整;

非第一帧的之后每一帧,重新计算总概率值,并进行归一化操作,使得总概率值与初始总值保持一致。

优选的,在所述的光线跟踪调度模块内,对概率值进行调整的方法如下:

对于属于背景的像素值,将光线跟踪概率置为0;

对于能通过重投影找到对应位置的像素值,则采用上一帧对应位置的概率值;否则,则再次将概率值初始化。

优选的,若未能找到对应的上一帧像素点位置,则进行归一化操作,通过获取当前帧的总概率值,与初始的总概率值进行对比,得到总概率值变化的系数,对每个像素的概率值进行调整。

优选的,所述的光线跟踪模块,对屏幕上的每个像素使用与像素位置和当前时间均相关的随机数生成方法,获得一个值在[0,1]区间内的随机浮点数;并将该值与光线跟踪调度模块中传递过来的概率值进行对比,如果生成的随机数位于[0,概率值]之间,则进行间接光的跟踪工作,否则该像素在当前帧就不执行间接光的跟踪。

优选的,所述的结果分析模块,根据当前帧计算出的光线跟踪结果,获得的间接光影响比例,调整像素点的光线跟踪的概率值,为下一帧光线跟踪调度模块的对比计算提供元数据。

优选的,施加“涟漪影响”调节所述的概率值,即当出现间接光计算概率值高的像素点后,其周围的一部分像素点的概率值也随之提高。

本系统的核心思想是,在实现了混合绘制的基础上,在光线跟踪前后插入了自适应的光线跟踪调度策略相关的控制模块,从而实现了对光线跟踪模块各像素间接光发射与否的自适应控制。本框架将绘制过程分割成一个个模块,每个模块能够产生中间结果,这些中间结果可以用作辅助数据信息,针对不同的绘制要求做对应的修改;且每个模块的功能相对独立,模块间的顺序可以根据需求进行一定程度的调整,而模块本身也能随着需求的改变来方便地增添或删减,可以用来完成一些复杂的任务,这一特点也使得本框架具有很强的可扩展性,能很方便地应对未来工作任务的改变。

对应地,本申请还提供一种混合式光线跟踪绘制方法,包括:

获取屏幕上每帧图像内各个像素的场景信息并进行光栅化;

根据光栅化结果,计算当前帧每个像素进行光线跟踪的概率值;

依据所述的概率值,对像素进行光线跟踪计算;

根据当前帧计算出的光线跟踪结果,调整对应像素的概率值;

在屏幕上输出显示绘制结果。

作为优选的,计算概率值的过程如下:

在第一帧开始时,进行概率值初始化工作,将屏幕上的所有像素的光线跟踪概率值初始化为给定的初始值;

将根据上一帧获得的信息进行判断,估计间接光对绘制结果的影响比例,对概率值进行调整;

非第一帧的之后每一帧,重新计算总概率值,并进行归一化操作,使得总概率值与初始总值保持一致。

附图说明

图1为本申请的混合绘制框架示意图;

图2为本申请光线跟踪调度模块的执行流程图;

图3为本申请光线跟踪模块的执行逻辑图;

图4为本申请结果分析模块的执行流程图。

具体实施方式

在下面的描述中阐述了很多具体细节以便于充分理解本申请,但是,本申请还可以采用其他不同于在此描述的其他方式来实施,因此,本申请并不限于下面公开的具体实施例的限制。

下面详细描述本申请的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,旨在用于解释本申请,而不能理解为对本申请的限制。

本实施例中的系统包含5种模块,示意图见图1,具体包括:

光栅化模块:该模块的作用是获取屏幕上每个像素点的几何与材质信息。

光线跟踪调度模块:负责判断并确定当前帧每个像素进行光线跟踪的概率值。

光线跟踪模块:根据上一个模块提供的对应像素概率值,来确定是否进行光线跟踪计算,在光线跟踪计算完毕后,对结果进行一定的偏差校正。

结果分析模块:紧接在光线跟踪的模块之后,用于根据当前帧计算出的光线跟踪结果,调整对应像素的概率值,以便为下一帧光线跟踪调度模块的对比计算提供元数据。

输出模块:最后的模块的作用是用来选择需要显示在屏幕上的绘制结果。

整个系统流程从光栅化模块开始,以输出模块作为结束。出于具体执行内容的需要,每种模块可以多次执行(在图1中用虚线箭头表示),且模块间也可以组成一个序列(在图1中用虚线框表示)进行多遍执行,这大大地提高了框架的灵活性,使得其可以用来进行需求不同的绘制工作。

图1中,每个模块完成对应的分工任务,并在每一帧顺序执行。在每一帧绘制完成后,输出模块会把最后的绘制结果显示在屏幕上。每个模块负责的内容,可以简要地概括成表1。

表1框架中的各模块功能概述与输入输出

接下来本实施例将详细介绍每个模块的实施方案:

1)光栅化模块:

该模块的作用是获取屏幕上每个像素点的几何与材质信息,并将其保存在自定义的g-缓冲区中,以供后续其他模块的使用,同时,可以生成光栅化的初步绘制结果。

本模块使用光栅化的绘制流水线和g-buffer缓冲技术,其中的顶点着色器使用的是缺省着色器,其作用是负责计算屏幕坐标上的每一个像素值所对应的几何体的几何信息。而接下来阶段中使用的像素着色器就负责借助顶点着色器提供的几何信息,以及全局的材质信息来生成g-缓冲区数据。框架需要保存世界坐标贴图、法线方向贴图、漫反射系数贴图、镜面反射系数贴图和一些其他材质系数贴图。该g-缓冲区包含一些额外的信息空间,这样做的目的,也是为了增加其可扩展性。这样的数据结构完全足够满足大多数绘制所需的基本信息需求。获得了对应像素点的几何与材质信息之后,将这些信息通过上述给出的g-缓冲区格式保存下来,这样就完成了当前帧绘制所需g-缓冲区的获取工作。

2)光线跟踪调度模块:

本模块负责实现自适应的光线跟踪算法中最关键的内容,即:判断并确定当前帧每个像素进行光线跟踪的概率值。

当前的实时光线跟踪技术(real-timeraytracing,rtrt)限于硬件性能和计算方法的因素,基本采取了每个像素较低的采样数。但是,在实际的绘制过程中,仅就绘制效果上来说,光线跟踪不同于光栅化的最大特点,体现在它对反射、折射等二次光路传递能量比例高的一类场景的优异效果展现上。而对于这类间接光照效果较少的场景的绘制上,光栅化的结果可能就基本满足用户需求了。

鉴于此,考虑是否能够把有限的计算资源尽量多地用在更能体现光线跟踪价值的地方,因此本申请提出这一自适应光线跟踪调度策略,在光线跟踪调度模块里实现。本申请的自适应调度策略将光线跟踪资源集中到间接光结果影响较大的像素点,实现在维持整体计算性能基本不变的情况下,对间接光影响较大的像素采用更高的采样数来进行光线跟踪,对间接光影响较小的像素采用较小的光线跟踪采样数,甚至不进行光线跟踪直接采用光栅绘制结果,从而在不影响帧率的前提下,使得绘制结果变得更加准确。

本模块的主体执行思路是,对屏幕上的所有像素评估出一个间接光照重要性的数值,并将其体现为光线跟踪概率值,从而指导后续光线跟踪模块是否进行间接光线发射,实现动态分配光线跟踪计算资源的目的。与光线跟踪模块相关的具体实现方式见下面章节光线跟踪模块的描述。这种概率性的控制方式,在具体每个像素上会给当前帧是否进行光线跟踪带来一定的随机性,但从统计学原理上及实践经验上都证明了整体上稳定性,而且在实践经验上这种随机性有利于使绘制结果不那么生硬。

本模块的具体执行逻辑如下算法所示:

a.在第一帧开始时,进行概率值初始化工作,将屏幕上的所有像素的光线跟踪概率值初始化为给定的初始值;

b.将根据上一帧获得的信息进行判断,估计间接光对绘制结果的影响比例,对概率值进行调整。对于属于背景的像素值,将光线跟踪概率置为0;对于能通过重投影找到对应位置的像素值,则采用上一帧对应位置的概率值;否则,则再次将概率值初始化;

c.非第一帧的之后每一帧,重新计算总概率值,并进行归一化操作,使得总概率值与初始总值保持一致。

上述b)中重投影的目的,在于在相邻的两帧间找到代表同一个世界坐标点的像素点位置,并为它们建立一个映射关系。从而可以继承该像素在上一帧对应位置处的概率值。重投影操作在gpu内进行计算,是传统方法,此处不再描述。

光线跟踪调度模块的执行流程图如图2。为了获得当前帧被调整后的总概率值,以便用于归一化,本框架推荐、但并不限于一种gpu上的实现途径:mipmapping方法。由于屏幕像素的概率分布被保存在一张贴图中,使用该贴图生成mipmap,其最终获得的大小为1x1的mipmap的值便是当前帧的平均概率值。用获得的平均概率值,乘上当前屏幕的宽高值,便可以获得总概率值,这样与初始的总概率值进行对比,就能得到总概率值变化的系数,从而对每个像素的概率值进行调整。

本申请的自适应调度策略,在实现效率上,要远高于提升全屏每个像素的采样数值的方式;在绘制效果上,则也要比多帧时序累加的方式要来得高效和迅速。

3)光线跟踪模块:

本模块的作用是基于上一个模块光线跟踪调度模块中提供的对应像素概率值,来确定是否进行光线跟踪计算,在光线跟踪计算完毕后,对结果进行一定的偏差校正。

模块执行的逻辑思路描述起来便是:对屏幕上的每个像素使用与像素位置和当前时间均相关的随机数生成方法,获得一个值在[0,1]区间内的随机浮点数。然后将该值与光线跟踪调度模块中传递过来的参考概率进行对比,如果生成的随机数位于[0,参考概率]之间,则进行间接光的跟踪工作,否则该像素在当前帧就不执行间接光的跟踪。

如果判定需要执行间接光的跟踪,则从起始点发射一条光线,与场景中的几何体进行求交运算。当发生相交判定时,调用对应的着色器,进行绘制或递归地再次生成一条光线进行跟踪;如果在判定区间内没有发生相交判定,则调用对应的着色器,执行相关的操作,并结束该光线的跟踪过程。在跟踪结束后,根据该光线递归过程中是否进行了间接光的发射,来决定是否进行比例-概率的转换计算。计算得到的结果将作为辅助输出数据,用于下一模块和下一帧的计算工作。

光线跟踪模块的执行逻辑图如图3。对一条光线来说,跟踪过程需要知道其起始点、方向和判定相交的范围。本文使用的框架中,在跟踪过程中,需要自己定制以下4种着色器,其调用的时机和常见用法可归纳如表2。

表2几种光线跟踪着色器的调用时机与用法

4)结果分析模块:

本模块紧接在光线跟踪的模块之后,用于根据当前帧计算出的光线跟踪结果,对每个像素施加影响,调整对应像素的概率值,以便为下一帧光线跟踪调度模块的对比计算提供元数据。也就是,根据获得的间接光影响比例,修正像素点的光线跟踪概率值,使其更适应当前场景的实际情况,从而能实现更准确的自适应光线跟踪调度。本模块是跟光线跟踪调度紧密配合工作的一个模块。

本模块获得的概率数据来自于光线跟踪的结果,如模块2中所述,光线跟踪模块将提供一个光线跟踪贡献比例值,如果该比例值低于预设的最低判定阈值,会调低该像素的光线跟踪概率值;反之,如果高于预设的最高判断阈值,会增大对应的光线跟踪概率值。通过这种方式,得以根据每帧获得的最新结果,实现自适应地修改概率分布的功能。需要注意的是,本模块最终输出的概率分布贴图对应的屏幕总概率值是未进行归一化的,需要在下一帧的光线跟踪调度模块中进行归一化操作。

结果分析模块的执行流程图如图4。图4中的“涟漪影响”指的是:当一个像素需要进行间接光计算的概率值很高时,其周围相邻的像素需要进行间接光计算的概率值一般也会比较高,反之也是如此。这种影响类似于扩散的涟漪,本申请的框架中加入了这一效果,即当出现间接光计算概率值高的像素点后,其周围的一部分像素点的概率值也随之修正提高。

5)输出模块:

在绘制过程中可以根据需求生成不同的绘制结果,为了统一管理的方便,也是为了能显式地将向屏幕上显示结果这一功能独立出来,本框架单独独立出这样一个模块来。

通过该模块,可以在不修改代码和重新绘制场景的前提下,切换要显示在屏幕上的贴图,从而可以根据需要查看绘制过程中产生的贴图。

在另一个实施例中,还提供一种混合式光线跟踪绘制方法,包括以下步骤:

获取屏幕上每帧图像内各个像素的场景信息并进行光栅化;

根据光栅化结果,计算当前帧每个像素进行光线跟踪的概率值;

依据所述的概率值,对像素进行光线跟踪计算;

根据当前帧计算出的光线跟踪结果,调整对应像素的概率值;

在屏幕上输出显示绘制结果。

本方法中,具体的绘制过程参考系统实施例的运行步骤,此处不再重复描述。

以上所述仅为本申请的较佳实施举例,并不用于限制本申请,凡在本申请精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1