CN104616327B - 一种基于曲面细分的着色器简化方法、装置及图形渲染方法 - Google Patents

一种基于曲面细分的着色器简化方法、装置及图形渲染方法 Download PDF

Info

Publication number
CN104616327B
CN104616327B CN201410541956.2A CN201410541956A CN104616327B CN 104616327 B CN104616327 B CN 104616327B CN 201410541956 A CN201410541956 A CN 201410541956A CN 104616327 B CN104616327 B CN 104616327B
Authority
CN
China
Prior art keywords
tinter
subdivision
coloring device
pixel coloring
fragment
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201410541956.2A
Other languages
English (en)
Other versions
CN104616327A (zh
Inventor
王锐
鲍虎军
杨先津
袁亚振
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Zhejiang Shangtang Technology Development Co Ltd
Original Assignee
Zhejiang University ZJU
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Zhejiang University ZJU filed Critical Zhejiang University ZJU
Priority to CN201410541956.2A priority Critical patent/CN104616327B/zh
Publication of CN104616327A publication Critical patent/CN104616327A/zh
Application granted granted Critical
Publication of CN104616327B publication Critical patent/CN104616327B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Abstract

本发明公开了一种基于曲面细分的着色器简化方法、装置及图形渲染方法,通过在原始着色器中插入细分着色器,并设定移动目标提取像素着色器拟合目标对应的目标片段,通过代码移动,将目标片段移动到细分着色器中,进而得到修正着色器作为简化着色器。本发明通过添加细分着色器,在进行图形渲染时,该细分着色器用于完成对待渲染模型的细分过程,通过细分,使待渲染模型中每个图元的面积减小,有助于提高渲染质量,且通过代码移动,将像素着色器中部分耗时较大的像素着色器中的任务分配到任务相对较少的其他着色器中进行,充分利用了执行器的性能,大大提高了着色器的渲染效率和渲染的实时性。

Description

一种基于曲面细分的着色器简化方法、装置及图形渲染方法
技术领域
本发明涉及图形渲染技术领域,尤其涉及一种基于曲面细分的着色器简化方法、装置及图形渲染方法。
背景技术
图形渲染的主要功能是根据给定的待渲染模型,在屏幕上生成(渲染)二维图像。其中,场景物体在屏幕上的形状和位置由待渲染模型本身的几何、相机的方位和参数决定。而待渲染模型在屏幕上的外观则由待渲染模型的材质属性、光源属性、纹理和设置的光照明模型决定。图形渲染的整个流程被分成一系列的阶段,这些阶段之间是线性串联的关系,前一阶段的输出是后一阶段的输入,前一阶段没有完成,则后一阶段不会启动,这种形式称之为渲染流水线或者渲染管线。由于计算性能对于渲染的重要性,当前渲染流水线都由特制的计算机硬件——图形处理单元(GPUs)来专门进行计算。
由于图形技术水平和图形硬件的发展水平的限制,早期的图形渲染大多使用的是固定功能的渲染流水线。所谓固定功能渲染流水线就是预先将渲染管线中各个阶段的功能定义好,在渲染启动时只需要设置管线各个阶段的渲染状态,再将顶点数据送入流水线,整个渲染流程不再施加额外的干预。在这种渲染方式中,管线的功能都已经固化,故称为固定功能渲染流水线。
随着图形技术和图形硬件技术的发展,固定功能流水线已经不能满足人们对高品质画面追求。为了追求更出色的渲染效果,人们将固定管线中的一些阶段进行了改进,使之不再执行固定的功能,而可以通过用户定制的代码来控制这个阶段的操作,实现更丰富的功能。改进过后的渲染流水线称之为定制流水线,也称之为可编程流水线。
在可编程流水线中,由用户定制的代码被称为着色器(Shader)。根据渲染管线不同阶段所提供可定制功能的不同,最新的可编程流水线提供了5种着色器,根据数据渲染的流程,依次为顶点着色器(Vertex Shader)、细分着色器(Tesselation Shader,包含2种着色器,对于DirectX,细分着色器包括外壳着色器(Hull Shader)和域着色器(DomainShader);对于OpenGL,细分着色器包括细分评估着色器和细分控制着色器)、几何着色器(Geometry Shader)和像素着色器(Fragment Shader)。以上5个着色器按照功能可分为3类。第一类着色器是顶点着色器,处理顶点信息。第二类着色器是几何处理着色器,包括几何着色器和细分着色器,用于计算并输出新的几何图元。第三类是像素着色器,其输入为插值后的几何属性并且输出为像素的颜色值。通过这些着色器,渲染流水线中不同阶段的不同硬件资源、不同硬件处理模式被暴露出来可以供用户操作与使用,从而编写具有特定计算功能的着色器程序。
由于可编程流水线所提供的可定制功能的着色器,给使用者提供了广阔的可定制功能,当前的很多应用程序如视频游戏、可视化、高真实感绘制等都依赖于高性能的着色器计算。但是,着色器程序编写的质量很大程度上依赖于程序员的经验。尽管有一些规则和工具集来处理交互式建模和着色器程序优化,整个渲染过程仍然耗时,并且也不是最高效的。因此,人们开展了一些工作进行自动的着色器优化,并且取得了很好的结果。
自动的着色器优化方法,以用户编写的着色器代码和待渲染场景为外部输入数据,通过对着色器代码使用渲染流水线硬件资源的分析与处理,实现对绘制流水线硬件资源的优化配置与调整,实现对待渲染模型渲染结果质量、渲染所需时间以及渲染过程所需显存空间的改变,从而提高图形处理单元(GPUs)的计算性能,满足用户的需要。
一般地,对于整个着色器,最耗时的渲染计算都在像素着色器部分,因此以前的方法主要的目标都在优化像素着色器的计算。Pellacini提供了一个用户可配置的着色器简化方法来进行逐像素的过程建模。程序生成一系列由原始着色器逐步简化生成的着色器。该方法通过对着色器的代码应用指定的简化规则来生成一系列的候选变种,然后评估变种与原始着色器之间度量的差来选择具有最小误差的候选变种。这种选择过程一直循环直到最后的着色器成为了常量。Sitthi-amorn使用遗传编程来自动简化渲染过程。与Pellacini类似,该算法同样计算一系列逐步简化的着色器,但考虑了更多的代码变换规则,包括代码中表达式语句中操作数与操作符的交换、语句的删除和语句的插入等,同时该方法使用遗传算法来选取更多的简化后的着色器,并且也能生成更快的和更可靠的结果。
而Nehab和Sitthi-amorn提供了一个像素重投影的方式来优化像素渲染。该方法中提供了一个缓存策略,利用实时渲染中固有的时空一致性,在高帧率的环境下,当每生成一帧时,算法将可见表面点上的指定数据存储到一个视口大小的离屏缓存里。当在后续帧中生成像素时,算法重投影像素的表面位置到上一帧中来判定该像素是否在上一帧中可见,如果可见,那么它的数据就在缓存中。如果数据在缓存中,算法就能重复使用先前缓存的变量值,而不是进行冗余的计算。否则,算法从头计算变量值,并且将其存储在缓存中以便下一帧使用。该算法不需要复杂的数据结构,也不需要CPU到GPU的数据传输。从而提高了渲染的时效性。
从信号处理的角度来看,生成一个渲染模型表面上的视觉效果就相当于该表面上的信号生成。因此,对像素着色器简化的问题应该看作是渲染流水线上多个着色器的整体优化问题,简化像素着色器的同时也优化其他着色器,从而实现更优的像素着色器简化。但是上述的这些方法,都只是仅仅生成简化的像素着色器。而没有将像素着色器的简化看作是一个渲染流水线上的整体优化问题。
发明内容
针对现有技术的不足,本发明提供了一种基于曲面细分的着色器简化方法、装置及图形渲染方法。
一种基于曲面细分的着色器简化方法,待简化的原始着色器包括顶点着色器和像素着色器,包括:
(1)设定若干组细分参数,针对每一组细分参数生成一个对应的细分着色器,并根据顶点着色器生成修正顶点着色器;
(2)从像素着色器的函数中选择若干个变量或表达式作为移动目标,根据各个移动目标对应的程序点提取与计算当前移动目标相关的语句作为对应的目标片段;
(3)针对任意一个目标片段和任意一个细分着色器,将当前目标片段从像素着色器中移动至当前细分着色器中,并利用所述的修正顶点着色器,以及移动后像素着色器和细分着色器,更新原始顶点着色器得到相应的修正着色器,并作为简化着色器,遍历所有的目标片段和细分着色器。
每组细分参数包括:每个图元内部细分的层数、每个图元在每层细分时每条边的细分数目与细分步长。基于以上细分参数可以完成对待渲染模型的细分。如果三角形设置3个组边长细分参数(即每条边的细分数目与细分步长),四边形设置4组边长细分参数。步骤(1)中设置的细分参数的组数根据实际情况设定,通常设定的组数越多,得到最优的简化着色器中概率越大。
本发明的原始着色器除顶点着色器和像素着色器外,可能还包括其他着色器。因此,步骤(3)中利用修正顶点着色器,以及移动后像素着色器和细分着色器,更新原始顶点着色器得到相应的修正着色器,应该指利用修正的顶点着色器、以及移动后像素着色和细分着色器取代原始顶点着色器中的相应部分,若原始顶点着色器中不存在相应部分,则直接插入。例如,假设原始顶点着色器中不存在细分着色器,则此时直接将形成的细分着色器插入即可;而对于顶点着色器和像素着色器,由于原始像素着色器已经存在,则需要进行替换。
步骤(2)中通过对原始着色器中的像素着色器进行语法分析,获取原始像素着色器的程序依赖图,并根据得到的程序依赖图提取像素着色器与计算该拟合目标相关的部分形成该目标片段(实际上先根据程序依赖图得到目标片段的抽象语法树,然后再转化为相应的目标片段)。本发明的程序点为移动目标在像素着色器中的位置,像素着色器中相同的变量或表达式处于不同的位置视为不同的变量或表达式进行处理。
本发明的着色器简化方法中通过在原始着色器中插入细分着色器,在进行图形渲染时,该细分着色器用于完成对待渲染模型的细分过程,通过细分,使待渲染模型中每个图元的面积减小,有助于提高渲染质量。且设定移动目标提取像素着色器拟合目标对应的目标片段,通过代码移动,将目标片段移动到细分着色器中,即将像素着色器中部分耗时较大的像素着色器中的任务分配到任务相对较少的其他着色器中进行,充分利用了执行器的性能,大大提高了着色器的渲染效率和渲染的实时性。
对于DirectX,所述的细分着色器包括外壳着色器和域着色器,通过如下步骤生成细分着色器:
(a1)以顶点着色器的输出变量作为输入变量与输出变量,初始化一个空的外壳着色器;
(a2)设置外壳着色器的细分参数为当前组细分参数;
(a3)向空的外壳着色器中添加主函数,所述的主函数用于将输入变量的值赋值给相应的输出变量;
(a4)以外壳着色器的输出变量作为输入变量,以顶点着色器的输出变量作为输出变量初始化一个域着色器;
(a5)向步骤(a4)中得到的域着色器添加主函数,所述的主函数用于将输入变量赋值给相应的输出变量;
(a6)将原始顶点着色器的主函数插入到域着色器的主函数中;
对于OpenGL,所述的细分着色器包括细分评估着色器和细分控制着色器,通过步骤(a1)和(a6)生成,所不同的是生成是细分评估着色器和细分控制着色器。
原始着色器的像素着色器对顶点的计算移动到细分着色器中,进而改为对细分后的得到的细分顶点的计算。
所述步骤(1)中通过如下步骤生成的修正顶点着色器:
(1-1)初始化一个输入变量与输出变量分别与原始顶点着色器相同的顶点着色器作为修正顶点着色器;
(1-2)向初始化得到的顶点着色器添加主函数,所述的主函数用于将主函数的输入变量的值赋值给主函数的输出变量。
改为对细分顶点的计算后,删除原始顶点着色器中相应的计算,直接将输入输出即可。
修正着色器的个数越多,简化后得到最优简化结果的概率越大,但是计算量也会增大,具体个数可根据实际应用需求设定。一个目标片段和一个细分着色器的组合对应一个修正着色器,因此,本发明中得到的修正像素着色器的个数最终取决于设定的移动目标的个数和设定的细分参数的组数。作为优选,所述步骤(2)中移动目标的个数为像素着色器的函数中变量或表达式个数的20%~100%。进一步,设定的细分参数的组数为4-256组。
所述步骤(3)通过以下方法将目标片段移动到细分着色器中:
(a)删除像素着色器中位于目标片段中、且在对应的程序点后不被使用的语句;
(b)将当前目标片段合并到细分着色器中与像素着色器相邻的着色器中,包括如下步骤:
(3-1)将当前目标片段的输出变量合并到细分着色器中与像素着色器相邻的着色器中,对于DirectX,细分着色器中与像素着色器相邻的着色器为域着色器,对于OpenGL,细分着色器中与像素着色器相邻的着色器为细分控制着色器;
(3-2)针对当前目标片段的每一个输入变量,确定像素着色器中当前目标片段对应的程序点之后,该输入变量是否被使用,如果未被使用,则在相邻的着色器中删除变量名与该输入变量相同的输出变量,并将相邻的着色器中该输入变量定义为局部变量;
(3-3)将当前目标片段插入到相邻的着色器中主函数结束前的最后一个程序点之后。
移动目标片段是将整个目标片段合并到相邻的着色器中,但是对像素着色器本身,并不是直接删除原始着色器的像素着色器中该目标片段,而是删除在该目标片段对应的程序点之后没有被使用的部分,这样保证删除后像素着色器能够继续使用。且将目标片段移动至相邻的着色器之后,对应的像素着色器和相邻的着色器的输入变量和输出变量需要进行相应的调整,以保证得到的修正着色器能够正常完成对待渲染模型的渲染工作。
针对当前目标片段中的每一个输出变量,进行如下操作:
当相邻的着色器不存在变量名与该输出变量相同的输出变量时,则将该输出变量添加至相邻的着色器;
当相邻的着色器中存在变量名与该输出变量相同,但数据类型不同的输出变量时,改变当前目标片段中该输出变量的变量名,并将修改后的输出变量添加至相邻的着色器中;
否则,不操作。
将目标片段合并到相邻的着色器中时,要考虑输入变量与输出变量的特征,保证变量之间互不干扰。
所述步骤(3)中得到简化后的着色器后还包括对得到简化着色器进行筛选:
利用原始着色器与各个简化着色器对待渲染模型进行渲染,根据渲染结果筛选得到若干个作为最终的简化着色器。
所述的渲染结果包括渲染图像、渲染时间和渲染所需的显存空间,所述步骤(2)包括如下步骤:
(a)将每一个渲染图像中所有像素点的颜色值按行或列排列成向量;
(b)计算各个修正着色器对应的向量与由原始着色器对应的向量之间的欧几里得距离,作为该修正着色器的渲染结果与原始着色器的渲染结果之间的渲染误差;
(c)根据所有修正着色器的渲染结果对应的渲染误差、渲染时间和渲染所需的显存空间,采用帕累托前端方法选择若干个修正着色器作为简化着色器。
采用帕累托前端方法(即帕累托最优法)选择待选着色器即选择满足帕累托前端条件的所有修正着色器。不同情况下,满足帕累托前端条件的个数也不同,因此,最终得到待选着色器的个数并不确定。最终着色器根据渲染任务选择,若渲染任务需要渲染质量,则可以选择渲染误差较小的修正着色器,若要求渲染速率快,则可以选择渲染时间较小的修正着色器。当选择渲染时间较小的修正着色器作为最终着色器,能够大大提高渲染效率,降低渲染时间消耗和渲染所需的显存空间,尤其适用于帧速率高的场景的渲染应用。
本发明还提供了一种基于曲面细分的图形渲染方法,渲染采用的原始着色器包括顶点着色器和像素着色器,包括如下步骤:
(S1)设定若干组细分参数,针对每一组细分参数生成一个对应的细分着色器,并根据顶点着色器生成修正顶点着色器;
(S2)从像素着色器的函数中选择若干个变量或表达式作为移动目标,根据各个移动目标对应的程序点提取与计算当前移动目标相关的语句作为对应的目标片段;
(S3)针对任意一个目标片段和任意一个细分着色器,将当前目标片段从像素着色器中移动至当前细分着色器中,并利用所述的修正顶点着色器,以及移动后像素着色器和细分着色器,更新原始顶点着色器得到相应的修正着色器,并作为简化着色器,遍历所有的目标片段和细分着色器;
(S4)从简化后的着色器中选择一个对待渲染模型进行渲染。
该渲染方法中先对原始着色器进行简化(采用如上所述的基于曲面细分的着色器简化方法进行简化),然后从简化后的着色器中选择一个进行对待渲染模型进行渲染。
本发明还还提供了一种基于曲面细分的着色器简化装置,待简化的原始着色器包括原始顶点着色器和原始像素着色器,包括:
细分着色器生成模块,用于设定若干组细分参数,针对每一组细分参数生成一个对应的细分着色器,并根据顶点着色器生成修正顶点着色器;
目标片段提取模块,用于从像素着色器的函数中选择若干个变量或表达式作为移动目标,根据各个移动目标对应的程序点提取与计算当前移动目标相关的语句作为对应的目标片段;
着色器生成模块,用于针对任意一个目标片段和任意一个细分着色器,将当前目标片段从像素着色器中移动至当前细分着色器中,并利用所述的修正顶点着色器,以及移动后像素着色器和细分着色器,更新原始顶点着色器得到相应的修正着色器,并作为简化着色器,遍历所有的目标片段和细分着色器。
所述的着色器简化装置还包括筛选模块,所述的筛选模块用于利用原始着色器与各个修正着色器对待渲染模型进行渲染,并根据渲染结果选择若干个修正着色器作为简化着色器。
本发明还提供了一种存储有计算机程序的计算机可读存储介质,其中所述计算机程序使计算机执行:
步骤1:设定若干组细分参数,针对每一组细分参数生成一个对应的细分着色器,并根据顶点着色器生成修正顶点着色器;
步骤2:从像素着色器的函数中选择若干个变量或表达式作为移动目标,根据各个移动目标对应的程序点提取与计算当前移动目标相关的语句作为对应的目标片段;
步骤3:针对任意一个目标片段和任意一个细分着色器,将当前目标片段从像素着色器中移动至当前细分着色器中,并利用所述的修正顶点着色器,以及移动后像素着色器和细分着色器,更新原始顶点着色器得到相应的修正着色器,并作为简化着色器,遍历所有的目标片段和细分着色器。
所述计算机程序还使计算机执行如下步骤:
利用原始着色器与各个修正着色器对待渲染模型进行渲染,根据渲染结果选择若干个修正着色器作为简化着色器。
本发明还提供了另一种存储有计算机程序的计算机可读存储介质,其中所述计算机程序使计算机执行:
步骤1:设定若干组细分参数,针对每一组细分参数生成一个对应的细分着色器,并根据顶点着色器生成修正顶点着色器;
步骤2:从像素着色器的函数中选择若干个变量或表达式作为移动目标,根据各个移动目标对应的程序点提取与计算当前移动目标相关的语句作为对应的目标片段;
步骤3:针对任意一个目标片段和任意一个细分着色器,将当前目标片段从像素着色器中移动至当前细分着色器中,并利用所述的修正顶点着色器,以及移动后像素着色和细分着色器,更新原始顶点着色的得到相应的修正着色器,并作为简化着色器,遍历所有的目标片段和细分着色器。
步骤4:从简化后的着色器中选择一个对待渲染模型进行渲染。
本发明中未作特殊说明,输入变量和输出变量均包括对应的变量名和数据类型。本发明中原始着色器和简化着色器(修正着色器),包括顶点着色器、几何着色器、像素着色器等均采用着色器语言(包括HLSL、GLSL、CG等)编写的源代码。为能够操作,本发明中生成的顶点着色器、细分着色器、几何着色器和像素着色器时均是先生成对应的抽象语法树,再进行处理,处理完后转化为基于着色器语言的代码。
与现有技术相比,本发明的优点在于:
提取像素着色器中部分代码(目标片段),通过代码移动,将像素着色器中部分耗时较大的像素着色器中的任务分配到任务相对较少的其他着色器中进行,充分利用了执行器(计算机)的性能,大大提高了着色器的渲染效率和渲染的实时性,且对原始像素着色器中添加对应于不同细分参数的细分着色器,有利于提高得到的修正着色器的渲染效果。此外,从整体上对原始着色器进行简化,进一步提高了简化效果,且自动完成简化,不需要人工干预。
附图说明
图1为本实施例的着色器简化方法的原理图。
具体实施方式
下面将结合具体实施例和附图对本发明进行详细说明。
一种基于曲面细分的着色器简化方法,待简化的原始着色器包括顶点着色器和像素着色器,该着色器简化方法的简化原理如图1所示,包括:
(1)设定若干组细分参数,针对每一组细分参数生成一个对应的细分着色器,并根据顶点着色器生成修正顶点着色器。
设定的细分参数的组数可根据实际应用需求调整,设定的细分参数的组数通常为4~256组(本实施例中为200组)。针对任意一组细分参数,对于DirectX,细分着色器包括外壳着色器和域着色器,通过如下步骤生成细分着色器:
(a1)以顶点着色器的输出变量作为输入变量与输出变量,初始化一个空的外壳着色器;
(a2)设置外壳着色器的细分参数为当前组细分参数;
(a3)向空的外壳着色器中添加主函数,所述的主函数用于将输入变量的值赋值给相应的输出变量,
(a4)以外壳着色器的输出变量作为输入变量,以顶点着色器的输出变量作为输出变量初始化一个域着色器;
(a5)向步骤(a4)中得到的域着色器添加主函数,所述的主函数用于将输入变量赋值给相应的输出变量;
(a6)将原始顶点着色器的主函数插入到域着色器的主函数中;
对于OpenGL,所述的细分着色器包括细分评估着色器和细分控制着色器,通过步骤(a1)和(a6)生成,所不同的是生成是细分评估着色器和细分控制着色器。
本实施例中步骤(1)中通过如下步骤生成的修正顶点着色器:
(1-1)初始化一个输入变量与输出变量分别与原始顶点着色器相同的顶点着色器作为修正顶点着色器;
(1-2)向初始化得到的顶点着色器添加主函数,该主函数用于将主函数的输入变量的值赋值给主函数的输出变量。
具体实现时需要通过抽象语法树实现:先将原始着色器中的顶点着色器转化为抽象语法树,并初始化一个空的修正顶点着色器对应的抽象语法树,顶点着色器的对应的抽象语法树中对应于输入变量的节点复制到修正顶点着色器对应的抽象语法树中作为输入变量对应的节点,将顶点着色器的输出变量对应的节点复制到修正顶点着色器对应的抽象语法树中作为输出变量对应的节点;继续向该修正顶点着色器对应的抽象语法树中添加主函数对应的节点,该主函数用于将主函数的输入变量的值赋值给主函数的输出变量。
(2)从像素着色器的函数中选择若干个变量或表达式作为移动目标,根据各个移动目标对应的程序点提取与计算当前移动目标相关的语句作为对应的目标片段;
移动目标的个数为像素着色器函数中的变量或表达式个数的20%~100%(本实施例中为80%)。以所有移动目标作为移动目标集合,分别对应于变量1~变量r,以及表达式1~表达式m。本实施例中通过对原始着色器中的像素着色器进行语法分析,获取原始像素着色器的程序依赖图,并根据得到的程序依赖图提取像素着色器与计算该拟合目标相关的部分形成该目标片段(实际上向得到目标片段的抽象语法树,然后再转化为目标片段)。
(3)针对任意一个目标片段和任意一个细分着色器,将当前目标片段从像素着色器中移动至当前细分着色器中,并利用修正顶点着色器,以及移动后像素着色器和细分着色器,更新原始顶点着色器得到相应的修正着色器,并作为简化着色器,遍历所有的目标片段和细分着色器。
本实施例中通过以下方法将目标片段移动到细分着色器中:
(a)删除像素着色器中位于目标片段中、且在对应的程序点后不被使用的语句;
(b)将当前目标片段合并到细分着色器中与像素着色器相邻的着色器中,包括如下步骤:
(3-1)将当前目标片段的输出变量合并到细分着色器中与像素着色器相邻的着色器中,对于DirectX,细分着色器中与像素着色器相邻的着色器为域着色器,对于OpenGL,细分着色器中与像素着色器相邻的着色器为细分控制着色器。针对当前目标片段中的每一个输出变量,进行如下操作:
当相邻的着色器不存在变量名与该输出变量相同的输出变量时,则将该输出变量添加至相邻的着色器;
当相邻的着色器中存在变量名与该输出变量相同,但数据类型不同的输出变量时,改变当前目标片段中该输出变量的变量名,并将修改后的输出变量添加至相邻的着色器中;
否则,不操作。
(3-2)针对当前目标片段的每一个输入变量,确定像素着色器中当前目标片段对应的程序点之后,该输入变量是否继续使用,如果未继续使用,则在相邻的着色器中删除变量名与该输入变量相同的输出变量,并将相邻的着色器中该输入变量定义为局部变量。
(3-3)将当前目标片段插入到相邻的着色器,则将当前目标片段插入到相邻的着色器中主函数结束前的最后一个程序点之后。
本实施例中的着色器基于DirectX实现渲染,相应步骤(1)中生成的细分着色器包括外壳着色器和域着色器。因此,步骤(3)中将移动目标对应的目标片段移动到细分着色器中,实际上是移动到生成的域着色器中。这样对于不同的移动目标,最终形成的域着色器会不同。针对一组细分参数得到的域着色器分别记为域着色器1~域着色器k,同理,由于移动目标不同,最后得到的修正像素着色器也不同,分别记为修正像素着色器1~域修正像素着色器k,k的取值取决于移动目标的个数。
本实施例中步骤(3)利用修正顶点着色器,以及移动后像素着色和细分着色器,更新原始顶点着色的得到相应的修正着色器是指按照细分参数和移动目标的之间的相互对应关系重新组合得到新的着色器作为修正着色器。以一组细分参数为例,首先将对应相同的拟合目标的修正像素着色器与域着色器配对,然后根据配对中的域着色器对应的细分参数,确定对应的外壳着色器,进而与修正顶点着色器组合得到修正着色器。
本实施例的着色器简化方法经步骤(3)得到简化着色器后还包括对得到简化着色器进行筛选:
利用原始着色器与各个简化着色器对待渲染模型进行渲染,根据渲染结果筛选得到若干个作为最终的简化着色器,其中渲染结果包括渲染图像、渲染时间和渲染所需的显存空间,修正像素着色器1~修正像素着色器k。对一个得到的修正着色器对应的渲染结果即为渲染结果1~渲染结果k。原始着色器的渲染结果记为原始渲染结果。本实施例中渲染在渲染流水线中使用各个着色器进行,首先将待渲染模型和相应的着色器输入到渲染流水线中,渲染过程中,待渲染模型作为相应的着色器的输入,输入到着色器中。
筛选具体如下:
(a)将每一个渲染图像中所有像素点的颜色值按行或列排列成向量;
(b)计算各个修正着色器对应的向量与由原始着色器对应的向量之间的欧几里得距离,作为该修正着色器的渲染结果与原始着色器的渲染结果之间的渲染误差;
(c)根据所有修正着色器的渲染结果对应的渲染误差、渲染时间和渲染所需的显存空间,采用帕累托前端方法选择若干个修正着色器作为简化着色器。
本实施例中以原始着色器对待渲染模型进行渲染时的时间为0.05毫秒,简化后着色器中渲染时间最短为0.005毫秒,渲染所需的显存空间最小为1MB,渲染误差最小为0。
基于以上简化方法得到的简化着色器,根据需要选择一个对待渲染模型进行渲染。
本实施例的着色器简化方法,通过基于代码移动的着色器简化装置实现,该着色器简化装置包括:
细分着色器生成模块,用于设定若干组细分参数,针对每一组细分参数生成一个对应的细分着色器,并根据顶点着色器生成修正顶点着色器;
目标片段提取模块,用于从像素着色器的函数中选择若干个变量或表达式作为移动目标,根据各个移动目标对应的程序点提取与计算当前移动目标相关的语句作为对应的目标片段;
着色器生成模块,用于针对任意一个目标片段和任意一个细分着色器,将当前目标片段从像素着色器中移动至当前细分着色器中,并利用所述的修正顶点着色器,以及移动后像素着色器和细分着色器,更新原始顶点着色器得到相应的修正着色器,并作为简化着色器,遍历所有的目标片段和细分着色器;
筛选模块,用于利用原始着色器与各个修正着色器对待渲染模型进行渲染,并根据渲染结果选择若干个修正着色器作为简化着色器。
本实施例中原始着色器和最终得到的简化着色器等均采用着色器语言编写,在简化过程中,基于着色器语言编写的着色器不能直接操作,需要转化为相应的抽象语法树,通过对抽象语法树进行操作(实际操作对应为抽象语法树的各个节点,可以执行移动、复制、删除、添加等操作),对像素着色器完成所有操作后,再转化为着色器语言,进而完成对着色器的操作。如步骤(3)中移动目标片段时,先将目标片段转化为抽象语法树,并将原始着色器中的每个部分转化为对应的抽象语法树,删除像素着色器中目标片段的相应部分时,在该像素着色器对应的抽象语法树中删除相应的节点,删除完成后再转化为基于相应的着色器语言的像素着色器。同样,合并至相邻的着色器中,也需要通过抽象语法树完成。
本申请实施例的各模块或各步骤可以用通用的计算装置来实现,可选地,它们可以用计算装置可执行的程序代码来实现,从而可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。因此,本申请实施例不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的最优选实施例,并不用于限制本发明,凡在本发明的原则范围内所做的任何修改、补充和等同替换等,均应包含在本发明的保护范围之内。

Claims (9)

1.一种基于曲面细分的着色器简化方法,待简化的原始着色器包括顶点着色器和像素着色器,其特征在于,包括:
(1)设定若干组细分参数,针对每一组细分参数生成一个对应的细分着色器,并根据顶点着色器生成修正顶点着色器;
(2)从像素着色器的函数中选择若干个变量或表达式作为移动目标,根据各个移动目标对应的程序点提取与计算当前移动目标相关的语句作为对应的目标片段;
(3)针对任意一个目标片段和任意一个细分着色器,将当前目标片段从像素着色器中移动至当前细分着色器中,并利用所述的修正顶点着色器,以及移动后的像素着色器和细分着色器,更新原始顶点着色器得到相应的修正着色器,并作为简化着色器,遍历所有的目标片段和细分着色器;
所述步骤(3)通过以下方法将目标片段移动到细分着色器中:
(a)删除像素着色器中位于目标片段中、且在对应的程序点后不被使用的语句;
(b)将当前目标片段合并到细分着色器中与像素着色器相邻的着色器中,包括如下步骤:
(3-1)将当前目标片段的输出变量合并到细分着色器中与像素着色器相邻的着色器中,对于DirectX,细分着色器中与像素着色器相邻的着色器为域着色器,对于OpenGL,细分着色器中与像素着色器相邻的着色器为细分控制着色器;
(3-2)针对当前目标片段的每一个输入变量,确定像素着色器中当前目标片段对应的程序点之后该输入变量是否被使用,如果未被使用,则在相邻的着色器中删除变量名与该输入变量相同的输出变量,并将相邻的着色器中该输入变量定义为局部变量;
(3-3)将当前目标片段插入到相邻的着色器中主函数结束前的最后一个程序点之后。
2.如权利要求1所述的基于曲面细分的着色器简化方法,其特征在于,所述步骤(1)中通过如下步骤生成修正顶点着色器:
(1-1)初始化一个输入变量与输出变量分别与原始顶点着色器相同的顶点着色器作为修正顶点着色器;
(1-2)向初始化得到的顶点着色器添加主函数,所述的主函数用于将主函数的输入变量的值赋值给主函数的输出变量。
3.如权利要求2所述的基于曲面细分的着色器简化方法,其特征在于,所述步骤(2)中移动目标的个数为像素着色器的函数中变量或表达式个数的20%~100%。
4.如权利要求1所述的基于曲面细分的着色器简化方法,其特征在于,针对当前目标片段中的每一个输出变量,进行如下操作:
当相邻的着色器不存在变量名与该输出变量相同的输出变量时,则将该输出变量添加至相邻的着色器;
当相邻的着色器中存在变量名与该输出变量相同,但数据类型不同的输出变量时,改变当前目标片段中该输出变量的变量名,并将修改后的输出变量添加至相邻的着色器中;
否则,不操作。
5.如权利要求1~4中任意一项权利要求所述的基于曲面细分的着色器简化方法,其特征在于,所述步骤(3)中得到简化后的着色器后还包括对得到简化着色器进行筛选:
利用原始着色器与各个简化着色器对待渲染模型进行渲染,根据渲染结果筛选得到若干个作为最优的简化着色器。
6.如权利要求5所述的基于曲面细分的着色器简化方法,其特征在于,所述的渲染结果包括渲染图像、渲染时间和渲染所需的显存空间,所述步骤(2)包括如下步骤:
(a)将每一个渲染图像中所有像素点的颜色值按行或列排列成向量;
(b)计算各个修正着色器对应的向量与由原始着色器对应的向量之间的欧几里得距离,作为该修正着色器的渲染结果与原始着色器的渲染结果之间的渲染误差;
(c)根据所有修正着色器的渲染结果对应的渲染误差、渲染时间和渲染所需的显存空间,采用帕累托前端方法选择若干个修正着色器作为简化着色器。
7.一种基于曲面细分的图形渲染方法,渲染采用的原始着色器包括顶点着色器和像素着色器,其特征在于,包括如下步骤:
(S1)设定若干组细分参数,针对每一组细分参数生成一个对应的细分着色器,并根据顶点着色器生成修正顶点着色器;
(S2)从像素着色器的函数中选择若干个变量或表达式作为移动目标,根据各个移动目标对应的程序点提取与计算当前移动目标相关的语句作为对应的目标片段;
(S3)针对任意一个目标片段和任意一个细分着色器,将当前目标片段从像素着色器中移动至当前细分着色器中,并利用所述的修正顶点着色器,以及移动后像素着色器和细分着色器,更新原始顶点着色器得到相应的修正着色器,并作为简化着色器,遍历所有的目标片段和细分着色器;
(S4)从简化后的着色器中选择一个对待渲染模型进行渲染;
所述(S3)通过以下方法将目标片段移动到细分着色器中:
(a)删除像素着色器中位于目标片段中、且在对应的程序点后不被使用的语句;
(b)将当前目标片段合并到细分着色器中与像素着色器相邻的着色器中,包括如下步骤:
(S3-1)将当前目标片段的输出变量合并到细分着色器中与像素着色器相邻的着色器中,对于DirectX,细分着色器中与像素着色器相邻的着色器为域着色器,对于OpenGL,细分着色器中与像素着色器相邻的着色器为细分控制着色器;
(S3-2)针对当前目标片段的每一个输入变量,确定像素着色器中当前目标片段对应的程序点之后该输入变量是否被使用,如果未被使用,则在相邻的着色器中删除变量名与该输入变量相同的输出变量,并将相邻的着色器中该输入变量定义为局部变量;
(S3-3)将当前目标片段插入到相邻的着色器中主函数结束前的最后一个程序点之后。
8.一种基于曲面细分的着色器简化装置,待简化的原始着色器包括原始顶点着色器和原始像素着色器,其特征在于,包括:
细分着色器生成模块,用于设定若干组细分参数,针对每一组细分参数生成一个对应的细分着色器,并根据顶点着色器生成修正顶点着色器;
目标片段提取模块,用于从像素着色器的函数中选择若干个变量或表达式作为移动目标,根据各个移动目标对应的程序点提取与计算当前移动目标相关的语句作为对应的目标片段;
着色器生成模块,用于针对任意一个目标片段和任意一个细分着色器,将当前目标片段从像素着色器中移动至当前细分着色器中,并利用所述的修正顶点着色器,以及移动后像素着色器和细分着色器,更新原始顶点着色器得到相应的修正着色器,并作为简化着色器,遍历所有的目标片段和细分着色器;
在着色器生成模块中,通过以下方法将目标片段移动到细分着色器中:
(a)删除像素着色器中位于目标片段中、且在对应的程序点后不被使用的语句;
(b)将当前目标片段合并到细分着色器中与像素着色器相邻的着色器中,包括如下步骤:
(b-1)将当前目标片段的输出变量合并到细分着色器中与像素着色器相邻的着色器中,对于DirectX,细分着色器中与像素着色器相邻的着色器为域着色器,对于OpenGL,细分着色器中与像素着色器相邻的着色器为细分控制着色器;
(b-2)针对当前目标片段的每一个输入变量,确定像素着色器中当前目标片段对应的程序点之后该输入变量是否被使用,如果未被使用,则在相邻的着色器中删除变量名与该输入变量相同的输出变量,并将相邻的着色器中该输入变量定义为局部变量;
(b-3)将当前目标片段插入到相邻的着色器中主函数结束前的最后一个程序点之后。
9.如权利要求8所述的基于曲面细分的着色器简化装置,其特征在于,还包括筛选模块,所述的筛选模块用于利用原始着色器与各个修正着色器对待渲染模型进行渲染,并根据渲染结果选择若干个修正着色器作为简化着色器。
CN201410541956.2A 2014-07-31 2014-10-14 一种基于曲面细分的着色器简化方法、装置及图形渲染方法 Active CN104616327B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410541956.2A CN104616327B (zh) 2014-07-31 2014-10-14 一种基于曲面细分的着色器简化方法、装置及图形渲染方法

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
CN2014103748086 2014-07-31
CN201410374808 2014-07-31
CN201410541956.2A CN104616327B (zh) 2014-07-31 2014-10-14 一种基于曲面细分的着色器简化方法、装置及图形渲染方法

Publications (2)

Publication Number Publication Date
CN104616327A CN104616327A (zh) 2015-05-13
CN104616327B true CN104616327B (zh) 2017-07-14

Family

ID=53150760

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410541956.2A Active CN104616327B (zh) 2014-07-31 2014-10-14 一种基于曲面细分的着色器简化方法、装置及图形渲染方法

Country Status (1)

Country Link
CN (1) CN104616327B (zh)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9786098B2 (en) * 2015-07-06 2017-10-10 Mediatek Inc. Apparatus for performing tessellation operation and methods utilizing the same
US9953395B2 (en) * 2016-08-29 2018-04-24 Intel Corporation On-die tessellation distribution
CN106504249B (zh) * 2016-10-19 2019-03-19 青岛达芬奇科技有限公司 部分曲面细分方法
CN107464208B (zh) * 2017-07-24 2019-07-09 浙江大学 一种图形绘制流水线中像素着色结果重用方法
CN112258412B (zh) * 2020-10-22 2021-07-13 浙江大学 基于定义域和值域的卷积近似的着色器自动滤波方法、装置和系统
CN116167906A (zh) * 2021-11-24 2023-05-26 荣耀终端有限公司 一种图像处理方法及电子设备

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7692660B2 (en) * 2006-06-28 2010-04-06 Microsoft Corporation Guided performance optimization for graphics pipeline state management
US8111260B2 (en) * 2006-06-28 2012-02-07 Microsoft Corporation Fast reconfiguration of graphics pipeline state
CN103810756A (zh) * 2014-01-17 2014-05-21 浙江大学 基于不规则区域的自适性的Loop细分曲面的绘制方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20100164954A1 (en) * 2008-12-31 2010-07-01 Sathe Rahul P Tessellator Whose Tessellation Time Grows Linearly with the Amount of Tessellation

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7692660B2 (en) * 2006-06-28 2010-04-06 Microsoft Corporation Guided performance optimization for graphics pipeline state management
US8111260B2 (en) * 2006-06-28 2012-02-07 Microsoft Corporation Fast reconfiguration of graphics pipeline state
CN103810756A (zh) * 2014-01-17 2014-05-21 浙江大学 基于不规则区域的自适性的Loop细分曲面的绘制方法

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
A code motion technique for accelerating general-purpose computation on the GPU;Takatoshi Ikeda等;《Parallel and Distributed Processing Symposium, 2006. IPDPS 2006. 20th International》;20060626;第1-3节 *
User-configurable Automatic Shader Simplification;Fabio Pellacini;《ACM Transactions on Graphics》;20051231;第24卷(第3期);全文 *
着色器简化和优化的研究与实现;宋西军;《中国优秀硕士学位论文全文数据库 信息科技辑》;20130115;第2013年卷(第1期);正文第8、16页 *
细分曲面拟合的局部渐进插值方法;赵宇 等;《计算机研究与发展》;20121231;第49卷(第8期);全文 *

Also Published As

Publication number Publication date
CN104616327A (zh) 2015-05-13

Similar Documents

Publication Publication Date Title
CN104616327B (zh) 一种基于曲面细分的着色器简化方法、装置及图形渲染方法
CN104167015B (zh) 一种基于表面信号拟合的着色器简化方法、装置及图形渲染方法
CN105787865B (zh) 基于游戏引擎和gpu并行处理的分形图生成与渲染方法
CN104183008B (zh) 一种基于表面信号拟合和曲面细分的着色器简化方法、装置及图形渲染方法
CN104537706B (zh) 一种基于代码移动的着色器简化方法、装置及图形渲染方法
CN102592303B (zh) 毛发运动合成器系统和用于毛发/皮毛流水线的优化技术
JP2004038926A (ja) テクスチャマップ編集
US20170330372A1 (en) Graphics processing systems
JP2002352273A (ja) 対話式にグラフィクスオブジェクトを編集するシステムおよび方法
Schäfer et al. State of the Art Report on Real-time Rendering with Hardware Tessellation.
CN110097609A (zh) 一种基于样本域的精细化绣花纹理迁移方法
JP6864495B2 (ja) 3dシーンのグローバル・イルミネーションの描画
CN117280387A (zh) 用于光线和路径追踪的位移微网格
JP2002334347A (ja) グラフィクスモデルの適応的サンプル距離フィールドを三角形モデルに変換する方法
JP2002324251A (ja) グラフィクスオブジェクトを編集する方法
CN111091620A (zh) 基于图形学的地图动态路网处理方法及系统、计算机设备
Krishnamurthy et al. Optimized GPU evaluation of arbitrary degree NURBS curves and surfaces
US11948240B2 (en) Systems and methods for computer animation using an order of operations deformation engine
CN103745496A (zh) 基于二维图像为交互界面的转换函数的直接体绘制方法
JP2002324252A (ja) グラフィクスオブジェクトをモデル化する方法
JP2002352270A (ja) モデルの適応的サンプル距離フィールドを訂正する方法
Liang et al. Automatic mesh and shader level of detail
Kravtsov et al. Controlled metamorphosis between skeleton‐driven animated polyhedral meshes of arbitrary topologies
Wuttke et al. Quality preserving fusion of 3d triangle meshes
Zhang Graphic Design Optimization Method Based on Deep Reinforcement Learning Model

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right

Effective date of registration: 20200925

Address after: 311215 room 288-8, 857 North Road, ningwei street, Xiaoshan District, Hangzhou, Zhejiang.

Patentee after: ZHEJIANG SHANGTANG TECHNOLOGY DEVELOPMENT Co.,Ltd.

Address before: 310027 Hangzhou, Zhejiang Province, Xihu District, Zhejiang Road, No. 38, No.

Patentee before: ZHEJIANG University

TR01 Transfer of patent right