一种基于OpenGL着色语言的程序式纹理的优化方法和系统
技术领域
本发明涉及图像渲染的技术领域,尤其涉及一种基于OpenGL着色语言的程序式纹理的优化方法及其系统。
背景技术
近年来,图像渲染技术高速发展,可以使用一个全功能的、高层次的程序语言解释每个片元的处理过程,通过数学方式来描述物体表面的纹路,自由的创建不同的渲染效果。其中技术核心就是如何通过着色器来实现算法,根据算法来合成一些数字图像或者照片。这类着色器即程序纹理着色器。对于最终图像的表现不那么重要的事物,或者覆盖大片区域的情形,都适合使用程序式纹理来表达。程序式纹理优势如下:程序生成纹理占用内存比预存纹理低;程序式纹理可以应用于任何大小的物体,同时得到更加精确的结果;程序式纹理着色器可以写入部分算法的关键参数,通过对参数的修改,同一个着色器能够产生很多趣味效果;体积的剖面表现力会更真实。
但是在程序式纹理具有这么多优势的情况下,依旧存在很多不足。例如带来很多不可避免地走样问题,对技术人员技术能力要求高,此类纹理访问耗时更长,不同平台效果存在差异等。
发明内容
本部分的目的在于概述本发明的实施例的一些方面以及简要介绍一些较佳实施例。在本部分以及本申请的说明书摘要和发明名称中可能会做些简化或省略以避免使本部分、说明书摘要和发明名称的目的模糊,而这种简化或省略不能用于限制本发明的范围。
鉴于上述现有存在的问题,提出了本发明。
因此,本发明解决一个的技术问题是:提供了对程序式纹理的优化方法,解决程序式纹理的走样问题,能够渲染出更加真实的图像。
为解决上述技术问题,本发明提供如下技术方案:一种程序式纹理的优化方法,包括以下步骤,定义模块定义程序式纹理着色器;输入待渲染的对象图像;运行所述程序式纹理着色器并绘制生成程序式条纹纹理;对所述条纹纹理依次进行操作,包括预先解析滤波模块、自适应的解析滤波模块、解析积分模块和频率截断模块;得到优化后的程序式条纹纹理结果。
作为本发明所述的程序式纹理的优化方法的一种优选方案,其中:定义所述程序式纹理着色器包括以下步骤,确定目标图像渲染的最终大小需求避免各种造成走样的情形;编写所述程序式纹理着色器,过程中使用着色器语言GLSL 的内置函数来实现平滑的插值、屏幕空间的导数计算以及计算滤波宽度,缓解锯齿摩尔纹或者闪烁点的走样;组建以上函数并依次运行完成所述程序式纹理着色器的定义。
作为本发明所述的程序式纹理的优化方法的一种优选方案,其中:包括根据各种造成走样的情形针对不同目标大小专门定义所述程序式纹理着色器,还包括以下步骤,编写模块针对最终图像为固定大小的对象,对当前大小进行渲染控制,在所述着色器编写中使用smoothstep()、mix()和clamp()函数避免仓促过渡的函数;所述编写模块针对对象最终大小不同的渲染情形,在所述程序式纹理着色器的编写中使用纹理的mipmap函数定义着色器;采样模块提高分辨率,在像素内的多个位置上进行采样,并将采样点的颜色值取平均值作为结果;欠采样模块运行片元着色器对高频数据进行欠采样。
作为本发明所述的程序式纹理的优化方法的一种优选方案,其中:所述 mipmap函数定义着色器包括以下步骤,判断物体最终渲染的大小;每个大小专门定义对应着色器;每个着色器提供不同的细节内容;绘制物体实现避免不同大小物体渲染走样。
作为本发明所述的程序式纹理的优化方法的一种优选方案,其中:所述针对不同大小专门定义着色器,包括以下着色器的运用步骤,创建着色器对象;把源码关联到每个着色器对象;编译着色器;创建程序;关联着色器到程序对象;链接程序;激活和关闭着色器程序;删除着色器和程序。
作为本发明所述的程序式纹理的优化方法的一种优选方案,其中:所述避免各种造成走样的情形,还包括纹素分辨率和像素分辨率相似的时候,利用纹理滤波缓解走样,在创建纹理时,设置纹理函数glTexParameteri的参数选项选择线性滤波。
作为本发明所述的程序式纹理的优化方法的一种优选方案,其中:所述采样模块确定像素中进行采样时的采样位置,在所述采样位置的周围取采样点,包括采用网格、随机、抖动和旋转的网格方法进行采样。
作为本发明所述的程序式纹理的优化方法的一种优选方案,其中:所述欠采样模块在片元着色器中进行,对高频数据进行欠采样,包括去除高频率段数据或者以更高频率进行采样的两种方式。
作为本发明所述的程序式纹理的优化方法的一种优选方案,其中:所述条纹纹理依次进行操作,其中所述预先解析滤波,利用低通滤波,通过较低频率值对较高频率值的消除,消除所述条纹纹理中的高频率数据;所述自适应的解析滤波,自适应的判断平滑滤波的大小,对屏幕空间所有比例进行恰当的过滤处理;所述解析积分,判断函数在时间上的卷积,然后对卷积后的结果函数进行采样来降低或者消除走样问题;所述频率截断,当滤波宽度过大的时候,使用函数的平均值替代函数真实值,完成片元着色器内部着色。
本发明解决另一个的技术问题是:提供了对程序式纹理的优化系统,解决程序式纹理的走样问题,能够渲染出更加真实的图像。
为解决上述技术问题,本发明提供如下技术方案:包括定义模块、程序式纹理着色器;预先解析滤波模块、自适应的解析滤波模块、解析积分模块和频率截断模块;所述定义模块通过操作编辑界面定义所述程序式纹理着色器;所述程序式纹理着色器用于将输入的待渲染的对象图像绘制生成条纹并渲染,且所述程序式纹理着色器还包括用于编写的编写模块、用于采样的采样模块和欠采样模块;所述预先解析滤波模块、所述自适应的解析滤波模块、所述解析积分模块和所述频率截断模块为设置于所述程序式纹理着色器的数据处理模块。
本发明的有益效果:提供程序式纹理反走样方法,能够在图像处理中渲染出更加真实的图像,从时间和空间两方面克服显示上的限制。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。其中:
图1为本发明第一种实施例所述程序式纹理的优化方法的整体流程示意图;
图2为本发明第一种实施例所述着色器读入源代码的示意图;
图3为本发明第一种实施例所述拥有字符串后关联到着色器的示意图;
图4为本发明第一种实施例所述着色器编译着色器的示意图;
图5为本发明第一种实施例所述着色器链接程序的示意图;
图6为本发明第一种实施例所述采样点采样的示意图;
图7为本发明第二种实施例所述程序式纹理的优化系统的整体结构示意图;
图8为本发明第二种实施例所述采样多分辨率的示意图;
图9为本发明第二种实施例所述真实黑白格纹理的优化示意图;
图10为本发明第二种实施例所述渲染效果对比示意图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合说明书附图对本发明的具体实施方式做详细的说明,显然所描述的实施例是本发明的一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明的保护的范围。
在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是本发明还可以采用其他不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本发明内涵的情况下做类似推广,因此本发明不受下面公开的具体实施例的限制。
其次,此处所称的“一个实施例”或“实施例”是指可包含于本发明至少一个实现方式中的特定特征、结构或特性。在本说明书中不同地方出现的“在一个实施例中”并非均指同一个实施例,也不是单独的或选择性的与其他实施例互相排斥的实施例。
本发明结合示意图进行详细描述,在详述本发明实施例时,为便于说明,表示器件结构的剖面图会不依一般比例作局部放大,而且所述示意图只是示例,其在此不应限制本发明保护的范围。此外,在实际制作中应包含长度、宽度及深度的三维空间尺寸。
同时在本发明的描述中,需要说明的是,术语中的“上、下、内和外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一、第二或第三”仅用于描述目的,而不能理解为指示或暗示相对重要性。
本发明中除非另有明确的规定和限定,术语“安装、相连、连接”应做广义理解,例如:可以是固定连接、可拆卸连接或一体式连接;同样可以是机械连接、电连接或直接连接,也可以通过中间媒介间接相连,也可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。
实施例1
参照图1的示意,示意为本实施例中提出一种程序式纹理的优化方法的整体流程示意图,通过对像素颜色处理方法的改善避免其走样问题,本实施例基于OpenGL着色语言的环境下,是可编程着色器,着色器的主程序会根据所需的功能而改变。OpenGL首先接收用户提供的几何数据,并且将他输入的数据经过一系列着色阶段中进行处理,包括顶点着色、细分着色以及几何着色器,然后被送入光栅化单元,光栅化负责剪切区域内的图元并生成片元数据,然后对每一个片元都执行一个片元着色器,然后产生用户最终想要的效果。着色器的模块程序一般由3大部分组成:全局变量声明、自定义函数和main函数,是显示芯片内部处理图形信号互相独立的并行处理单元。其中片元着色器则需要为一个片元计算颜色,至少片元着色器必须把颜色赋给全局变量,该着色器能够计算颜色,或者能够查询到顶点着色器已经赋了怎样的颜色值,其实现可参照如下:
需要说明的是,虽然看上去片元着色器和顶点着色器使用了同一个全局变量,但由于这两个着色器是先后执行的,所以gl_FragColor变量的值在中间已经被OpenGL流水线修改了,而片元着色器看到的取决于当前被处理的片元中的图元,在OpenGL程序本身正在执行的过程中才能被编译。
进一步,本实施例方法包括以下步骤:
S1:定义模块100定义程序式纹理着色器200;本步骤中包括如下步骤:
确定目标图像渲染的最终大小需求避免各种造成走样的情形;避免各种造成走样的情形。另外还包括纹素分辨率和像素分辨率相似的时候,利用纹理滤波缓解走样,在创建纹理时,设置纹理函数glTexParameteri的参数选项选择线性滤波。
编写程序式纹理着色器200,过程中使用着色器语言GLSL的内置函数来实现平滑的插值(smoothstep())、屏幕空间的导数计算(dFdx()dFdy())以及计算滤波宽度(fwidth()),缓解锯齿摩尔纹或者闪烁点的走样;组建以上函数并依次运行完成程序式纹理着色器200的定义;输入待渲染的对象图像。
根据各种造成走样的情形针对不同目标大小专门定义程序式纹理着色器 200,还包括以下步骤,
编写模块201针对最终图像为固定大小的对象,对当前大小进行渲染控制,在着色器编写中使用smoothstep、mix和clamp函数避免仓促过渡的函数;编写模块201针对对象最终大小不同的渲染情形,在程序式纹理着色器200的编写中使用纹理的mipmap函数定义着色器,其他情况对纹理进行欠采样,适当使用mipmap改善反走样特性。
其中mipmap函数定义着色器包括以下步骤,判断物体最终渲染的大小;每个大小专门定义对应着色器;每个着色器提供不同的细节内容;绘制物体实现避免不同大小物体渲染走样。
smoothstep函数原型实现可参照如下:
mix函数原型实现可参照如下:
clamp函数原型实现可参照如下:
进一步的,针对不同大小专门定义着色器,包括以下着色器的运用步骤,创建着色器对象;把源码关联到每个着色器对象;编译着色器;创建程序;关联着色器到程序对象;链接程序;激活和关闭着色器程序;删除着色器和程序。着色器的源代码必须是以NULL结尾的分符合C标准定义的字符串(也就是一个字符的序列,并且最后一个字节为0),通常着色器源代码会放在文本文件中,然后这个文本文件作为单独的字符串被读入OpenGL程序。
为了创建着色器程序,首先需要创建两个着色器对象,接下来为每个着色器读入源代码,对于源代码文件的名称没有任何限制,读入程序的实现可以参照图2的示意,拥有字符串后关联到着色器上的实现可参照图3的示意,变编译着色器可参照图4的示意。编译好之后,再创建程序对象并将着色器对象与之关联起来,最后链接至整个程序,链接实现可参照图5的示意,完成本实施例着色器的自定义。
采样模块202提高分辨率,在像素内的多个位置上进行采样,并将采样点的颜色值取平均值作为结果;采样模块202确定像素中进行采样时的采样位置,在采样位置的周围取采样点,包括采用网格、随机、抖动和旋转的网格方法进行采样。其中,网格是最简单的算法,像素分离为几个子像素,每个像素都来自他们的中心,实现起来又快又简单,但是由于这类抽样很有有规律,如果子像素数量很少的话,锯齿还是存在的。随机也称为stochasticsampling,这类方法避免了像网格抽样的那种规律性。但是,由于这类不规则的模式,采样在其他1些像素和缺少的区域没必要要的结束。Poissiondisc又是1个随机取样的算法,但是每两个取样位置距离都不是很近。终究结果是1个随机散布的偶数。但是,这个算法需要的时间太大了以致于不能证明它用在实时渲染,除非样品本身计算比每一个像素的定位取样点或没复位的取样点昂贵。抖动(Jittered) 是网格算法的修正,近似于Poissiondisc。1个像素分离为几个子像素,但是样品不是每一个都从中心发出的,但是从在子像素中的1个随机的点。集合能仍然存在,但是程度较轻。旋转的网格(Rotatedgrid)是1个2x2网格的布局被使用但是取样模式是旋转的,来避免在水平或垂直轴的校准,通常大大的提高的抗锯齿的质量。对1个最好的模式,旋转角度是arctan(1/2)(大约26.6°),正方形被1个因素拉伸√5/2。
进一步的,由于图形信号是连续的,这种用离散的量(像素)表示连续的量(图形)而引起的失真叫做走样,而用于减少或消除这种效果的技术,就称为反走样;走样可以分为边缘走样和纹理失真,目前存在的反走样采样包括多点采样和区域采样,其中在区域采样中,像素被看成一个区域而不是一个单个的点,可通过考虑被象素多边形覆盖的区域面积来计算象素的值,mip-map函数从原图像开始,不断的从高分辨率图像中取多个象素求其纹理颜色的平均,生成低分辨率图像的一个象素,构成分辨率从高到低的一组图像,原分辨率的图像和取平均后的低分辨率图像被存储到多个表中。例如若分辨率在每个方向上降低一半,则取四个象素的纹理值的平均做为低一级分辨率图像的一个象素,其效果等价于用一个正方形滤波器做卷积,过程可参照图8的示意(R、G、B 分别为图像的三个变量)。
Mip-map函数在确定屏幕上每一象素内可见面的平均纹理颜色时需计算三个参数,即屏幕象素中心在纹理平面上映射点的坐标(u,v)和屏幕象素内可见表面区域在纹理平面上所映射区域的边长d,其中(u,v)取为屏幕象素内可见表面在纹理来逼近这些曲边四边形区域,从而使得计算该区域平均纹理颜色变得容易。可通过纹理映射变换和取景变换的逆变换求得,d取为该近似正方形的边长。
假设屏幕像素为边长为1的正方形,则:
上式中偏导数ux、vx、uy、vy表示u、v对x、y的各自偏导数可以通过相邻像素的u、v值做有限差分近似求出。设屏幕空间的一点(x,y)映射到纹理平面的点的坐标为(u,v),Mip-map函数为正方形包围盒,并没有其他(例如长方形盒)的四边形对屏幕象素更紧地包裹,尤其在映射区域的形状为菱形时最为明显,并且当包围盒比实际映射区域大得多的时候,可能导致严重的走样。本实施例中通过对上述坐标为(u,v)进行坐标变换将Mip-map函数映射的包围盒变换为平行四边形,将平面坐标变化应用于本实施例中。
具体如下步骤:
坐标变换是通过整体坐标系(x-y)和局部坐标系(s-m)的映射关系得到;定义包围盒四节点a、b、c、d,该四节点分别为包围盒的四个角点,采用局部坐标系(s-m),可得其位移映射表达式:
式中:ui为节点i在x方向投影,vi为节点i在y方向投影,Ni(s,m)为形函数。
为了使映射的四个节点(si,mi)与角点(xi,yi)互为对应点,整体坐标 (x,y)和局部坐标(s,m)的变换为:
根据等参数的原理,因此得出本实施例对于正方形包围盒的映射位移变换的表达式,确定平面四节点四边形等参数单元的几何形状和位移模式(仍然为上述位移映射表达式)。
将得到位移模式代入平面问题的几何方程得到单元应变量的计算式,接着对局部函数坐标做偏导数变换:
式中[J]为雅可比矩阵。因此先后经过坐标的映射关系、单元应变量和偏导数变换,最终得到变量的平面四边形变换四个顶点坐标完成变换。本实施例经过上述坐标变换得到的四边形包围盒明显较正方形的包围盒反走样的效果更佳。
欠采样模块203运行片元着色器对高频数据进行欠采样。欠采样模块203 在片元着色器中进行,对高频数据进行欠采样,包括去除高频率段数据或者以更高频率进行采样的两种方式。例子说明:为了了解走样问题并且去除走样瑕疵方法,使用一个球上面交替绘制黑白条纹的例子,开发一个片元着色器支持反走样。这个着色器会需要判断每个片元绘制成白色或者黑色的信息,形成线条。
S2:运行程序式纹理着色器200并绘制生成程序式条纹纹理;
S3:对条纹纹理依次进行操作,包括预先解析滤波模块300、自适应的解析滤波模块400、解析积分模块500和频率截断模块600;条纹纹理依次进行操作,其中,预先解析滤波300,利用低通滤波,通过较低频率值对较高频率值的消除,消除条纹纹理中的高频率数据;自适应的解析滤波400,自适应的判断平滑滤波的大小,对屏幕空间所有比例进行恰当的过滤处理;解析积分500,判断函数在时间上的卷积,然后对卷积后的结果函数进行采样来降低或者消除走样问题;频率截断600,当滤波宽度过大的时候,使用函数的平均值替代函数真实值,完成片元着色器内部着色。
S4:得到优化后的程序式条纹纹理结果。
还需要说明的是,本实施例中提出优化方法的场景一:
以球体黑白条纹渲染为例,去除走样瑕疵
(1)、运用着色器语言生成程序式黑白条纹纹理;
(2)、预先解析滤波:低通滤波,通过较低频率值,对较高频率值进行消除,可使用上述smoothstep()函数实现消除条纹中的高频率数据。其具体实现步骤实在着色器编写过程,运用着色语言,在着色器之内运用此函数对数据平滑处理。
(3)、自适应的解析滤波:自适应的判断平滑滤波的大小,对屏幕空间所有比例进行恰当的过滤处理。具体处理方式为使用GLSL提供的内置函数dFdx() 来判断屏幕空间内x方向上的变化率,dFdy()来判断屏幕空间内y方向上的变化率,这两个函数在片元着色器中给相关位置的梯度向量计算提供所需的信息。给定一个函数f(x,y),梯度定义为:G[f(x,y)]=[df/dx,df/dy],内置函数fwidth()可以返回梯度值的近似值。
(4)、解析积分:通过判断函数在时间上的卷积,然后对卷积后的结果函数进行采样来降低或者消除走样问题。举例说明:实现一个支持解析反走样的程序式砖块纹理着色器。这个例子使用了atep()函数来实现周期性砖块花纹。周期性的step()函数,关键在于计算这个函数的积分,然后对这个积分而不是函数本身进行采样,得到的时加权平均的结果,降低走样可能性。
(5)、频率截断:在滤波宽度过大的时候,使用函数的平均值替代函数真实值。频率截断的目的:有些函数没有解析解,或者很难求解析解,上一步无法顺利完成,会采用这一方法。例如棋盘格花纹这个反走样技术度量的标准方法,需要给出棋盘格花纹两个颜色值,这两个颜色平均值以及棋盘格花纹变化频率。片元着色器计算滤波大小,然后完成相邻棋盘格之间平滑插值。当滤波宽度过大,即In变量的变化过于频繁,此时就会用到颜色平均值来替代真实值,进行所谓“截断”,同样也需要平滑插值完成计算得到的颜色和平均颜色之间的过渡过程。完成这个步骤之后就完成片元着色器内部着色计算反走样的方法,从而达成整个纹理优化的目的。
参照图9~10的示意,图9示意为本实施例采用基于OpenGL着色语言的程序式纹理的优化方法生成的真实渲染效果图,而通过传统程序式纹理着色器语言例如:HLSL、GLSL和RM,本测试利用HLSL对球体黑白条纹渲染,其生成的效果为图10左侧a的示意,图10右侧b示意为采用本实施例方法生成的真实渲染图,由图中的对比明显可以看出本实施例渲染效果较佳。
实施例2
参照图7的示意,示意为本实施例提出的一种程序式纹理的优化系统,上述实施例提出的方法能够依托于本系统实现。具体的,本系统包括定义模块100、程序式纹理着色器200;预先解析滤波模块300、自适应的解析滤波模块400、解析积分模块500和频率截断模块600;其中定义模块100通过操作编辑界面定义程序式纹理着色器200;程序式纹理着色器200用于将输入的待渲染的对象图像绘制生成条纹并渲染,且程序式纹理着色器200还包括用于编写的编写模块201、用于采样的采样模块202和欠采样模块203;预先解析滤波模块300、自适应的解析滤波模块400、解析积分模块500和频率截断模块600为设置于程序式纹理着色器200的数据处理模块。
定义模块100用于程序式纹理着色器200的编写和设计,预先解析滤波模块300、自适应的解析滤波模块400、解析积分模块500和频率截断模块600 为基于程序式纹理着色器200下的操作模块,能够对输入程序式纹理着色器200 的渲染图像进行相对应的数据处理,可以为写入对应功能程序的处理芯片,以硬件设备为载体。因此不难理解的是,程序式纹理着色器200同样还包括用于编写的编写模块201、用于采样的采样模块202和欠采样模块203,电脑芯片是硬件级别,将一些功能集合到一个集成电路上,比较高效,但灵活性不高,电脑软件是软件级别,用编程语言写成的程序。
还需要说明的是,上述如在本申请所使用的,术语“组件”、“模块”、“系统”等等旨在指代计算机相关实体,该计算机相关实体可以是硬件、固件、硬件和软件的结合、软件或者运行中的软件。例如,组件可以是,但不限于是:在处理器上运行的处理、处理器、对象、可执行文件、执行中的线程、程序和 /或计算机。作为示例,在计算设备上运行的应用和该计算设备都可以是组件。一个或多个组件可以存在于执行中的过程和/或线程中,并且组件可以位于一个计算机中以及/或者分布在两个或更多个计算机之间。此外,这些组件能够从在其上具有各种数据结构的各种计算机可读介质中执行。这些组件可以通过诸如根据具有一个或多个数据分组(例如,来自一个组件的数据,该组件与本地系统、分布式系统中的另一个组件进行交互和/或以信号的方式通过诸如互联网之类的网络与其它系统进行交互)的信号,以本地和/或远程过程的方式进行通信。
应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。