一种实现OpenGL累积操作的方法及装置
技术领域
本发明涉及计算机图形领域,尤其涉及一种实现OpenGL累积操作的方法及装置。
背景技术
“累积操作”作为OpenGL的一项重要功能,能够实现场景抗锯齿、运动模糊、景深模拟及计算多个光源产生的柔和阴影等。根据OpenGL标准,可将“累积操作”划分为5种模式:GL_ACCUM模式、GL_LOAD模式、GL_RETURN模式、GL_MULT模式和GL_ADD模式。
由于颜色缓冲区或累积缓冲区通常开辟在GPU侧的显存中,因此,OpenGL“累积操作”的实现一般会通过DMA(Direct Memory Access)将颜色或累积缓冲区中的数据复制一份到CPU(Central Processing Unit)侧的主存,然后由CPU完成相应计算,最后再通过DMA的方式将计算结果写入颜色或累积缓冲区,这种通过CPU对显存中的颜色或累积缓冲区进行访问和计算,需要频繁的在主存和显存间搬移大块数据,图形渲染效率较低,而且会影响总线传输带宽。
发明内容
本发明实施例提供了一种实现OpenGL累积操作的方法及装置,用于解决传统累积操作实现方法存在渲染效率低的问题
在本发明实施第一方面,提供了一种实现OpenGL累积操作的方法,包括:
步骤S1、保存图形上下文当前状态,将所述图形上下文当前状态设置为默认值,并根据累积模式设置颜色掩码;
步骤S2、获取当前累积缓冲区与颜色缓冲区的相关信息,其中,所述相关信息至少包括存放图像的尺寸、格式和数据首地址;
步骤S3、创建两个纹理对象,将所述纹理对象分别绑定到纹理单元0和纹理单元1,并将累积缓冲区中图像上传至纹理单元0,将颜色缓冲区中图像上传至纹理单元1;
步骤S4、根据当前累积模式,将累积缓冲区或颜色缓冲区设置为GPU渲染目标;
步骤S5、根据当前累积模式,载入特定的预备顶点着色器和片段着色器,获得特定纹理贴图效果;
步骤S6、GPU根据所述顶点着色器和所述片段着色器进行渲染,并将渲染结果存放到所述GPU渲染目标中。
在本发明实施例第二方面,提供了一种实现OpenGL累积操作的装置,包括:
保存模块,用于保存图形上下文当前状态,将所述图形上下文当前状态设置为默认值,并根据累积模式设置颜色掩码;
获取模块,用于获取当前累积缓冲区与颜色缓冲区的相关信息,其中,所述相关信息至少包括存放图像的尺寸、格式和数据首地址;
上传模块,用于创建两个纹理对象,将所述纹理对象分别绑定到纹理单元0和纹理单元1,并将累积缓冲区中图像上传至纹理单元0,将颜色缓冲区中图像上传至纹理单元1;
设置模块,用于根据当前累积模式,将累积缓冲区或颜色缓冲区设置为GPU渲染目标;
载入模块,用于根据当前累积模式,载入特定的预备顶点着色器和片段着色器,获得特定纹理贴图效果;
渲染模块,用于GPU根据所述顶点着色器和所述片段着色器进行渲染,并将渲染结果存放到所述GPU渲染目标中。
从以上技术方案可以看出,本发明实施例具有以下优点:
本发明实施例中,通过将累积缓冲区和颜色缓冲区作为纹理图像,然后根据累积模式的不同加载不同的顶点着色器和片段着色器,以实现特定的纹理贴图效果,并通过绘制矩形命令使GPU进行相应的纹理贴图和渲染,将结果放入累积缓冲区或颜色缓冲区。使得GPU的纹理贴图功能得到充分利用,减少CPU的参与,进而避免频繁传输数据,提高GPU的渲染效率的同时降低CPU与总线的负荷。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的实现OpenGL累积操作的方法一个实施例流程图;
图2为本发明实施例提供的实现OpenGL累积操作的装置一个实施例结构图;
具体实施方式
本发明实施例提供了一种实现OpenGL累积操作的方法及装置,用于保障图形渲染效果并提高渲染效率。
为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,下面所描述的实施例仅仅是本发明一部分实施例,而非全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
请参阅图1,本发明实施例中实现OpenGL累积操作方法一个实施例包括:
S101、保存图形上下文当前状态,将所述图形上下文当前状态设置为默认值,并根据累积模式设置颜色掩码;
所述图形上下文表示图形绘制的平台,包含绘制参数以及需要执行一系列绘图命令的设备信息。所述图形上下文当前状态主要包括渲染目标、视口状态、颜色缓冲区状态、深度缓冲区状态、模板缓冲区状态、纹理状态及各模块/功能的使能状态。
由于累积缓冲区的写入操作会受颜色掩码影响,因而在累积模式为GL_ACCUM、GL_LOAD、GL_MULT或GL_ADD时,设置颜色掩码,以对red、green、blue和alpha这4种颜色成分允许写入。
S102、获取当前累积缓冲区与颜色缓冲区的相关信息,其中,所述相关信息至少包括存放图像的尺寸、格式和数据首地址;
当累积模式为GL_ACCUM、GL_LOAD、GL_MUL或GL_ADD时,所述颜色缓冲区为OpenGL标准函数glReadBuffer()指定的缓冲区;当累积模式为GL_RETURN时,所述的颜色缓冲区为由OpenGL标准函数glDrawBuffer()指定的缓冲区。
S103、创建两个纹理对象,将所述纹理对象分别绑定到纹理单元0和纹理单元1,并将累积缓冲区中图像上传至纹理单元0,将颜色缓冲区中图像上传至纹理单元1;
S104、根据当前累积模式,将累积缓冲区或颜色缓冲区设置为GPU渲染目标;
可选的,当所述累积模式为GL_ACCUM、GL_LOAD、GL_MULT或GL_ADD时,将累积缓冲区设为GPU渲染目标;
当所述累积模式为GL_RETURN时,将颜色缓冲区设为GPU渲染目标。
S105、根据当前累积模式,载入特定的预备顶点着色器和片段着色器,获得特定纹理贴图效果;
所述顶点着色器为顶点被渲染时执行的指令代码,所述片段着色器为在GPU上用于片段处理的程序,一个片段对应一个像素值,且具有纹理坐标、深度等信息。在本发明实施例中,不同累积模式下载入的顶点着色器相同,载入的片段着色器存在区别。
可选的,载入特定片段着色器具体为:
若累积模式为GL_ACCUM时,则载入的片段着色器的输出颜色值为:gl_FragColor=accumValue*texture2D(sampler0,vTexcoor0)+texture2D(sampler1,vTexcoor1);
若累积模式为GL_LOAD时,则载入的片段着色器的输出颜色值为:gl_FragColor=accumValue*texture2D(sampler1,vTexcoor1);
若累积模式为GL_RETURN或GL_MULT时,则载入的片段着色器的输出颜色值为:gl_FragColor=accumValue*texture2D(sampler0,vTexcoor0);
若累积模式为GL_ADD时,则载入的片段着色器的输出颜色值为::gl_FragColor=accumValue+texture2D(sampler0,vTexcoor0);
其中,gl_FragColor为片段着色器最终输出的颜色值,accumValue为片段着色器的累积系数,函数texture2D(sampler0,vTexcoor0)表示返回纹理单元0在坐标vTexcoor0处的颜色采样值,函数texture2D(sampler1,vTexcoor1)表示返回纹理单元1在坐标vTexcoor1处的颜色采样值。sampler是一个uniform类型的变量,处理不同片元时这个变量值是一致不变的,一个sampler和一个texture对应,类型也对应。
S106、GPU根据所述顶点着色器和所述片段着色器进行渲染,并将渲染结果存放到所述GPU渲染目标中。
计算机在执行绘制矩形命令时,需要首先确定矩形顶点,在本发明实施例中,执行绘制矩形命令,将所述矩形的4个顶点分别设置为{-1.0,-1.0,1.0,1.0}、{1.0,-1.0,1.0,1.0}、{1.0,1.0,1.0,1.0}、{-1.0,1.0,1.0,1.0},分别代表窗口的左下角、右下角、右上角和左上角,即顶点坐标格式表示为{x,y,z,w}。
进一步的,所述顶点坐标对应的纹理单元0和纹理单元1的纹理坐标分别设定为{0.0,0.0}、{1.0,0.0}和{1.0,1.0}、{0.0,1.0},纹理坐标格式为{s,t}。纹理图像是方形数组,纹理坐标通常可定义成一、二、三或四维形式,称为s,t,r和q坐标,以区别于物体坐标(x,y,z,w)和其他坐标。一维纹理常用s坐标表示,二维纹理常用(s,t)坐标表示,目前忽略r坐标。q坐标像w一样,一般情况下其值几乎均为1,主要用于建立齐次坐标。
优选的,还包括恢复所述步骤S1中保存下来的当前渲染目标、视口状态、颜色缓冲区状态、深度缓冲区状态、模板缓冲区状态、纹理状态、各模块/功能的使能状态等图形上下文状态信息。
本实施例中,所述实现OpenGL累积操作的方法,将累积缓冲区和颜色缓冲区中的图像作为纹理图像使用,并根据不同的累积模式令GPU加载不同的顶点着色器和片段着色器,以实现特定的纹理贴图效果,最后再通过绘制矩形命令使GPU完成相应的纹理贴图和渲染,并把结果存放在累积缓冲区或颜色缓冲区,实现OpenGL“累积操作”的过程中,并充分利用了GPU的纹理贴图功能,大大提高了累积操作的效率。
应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。
上面主要描述了一种实现OpenGL累积操作的方法,下面将对一种实现OpenGL累积操作的装置进行详细描述。
图2示出了本发明实施例中实现OpenGL累积操作的装置一个实施例结构图。
所述实现OpenGL累积操作的装置,包括:
保存模块210,用于保存图形上下文当前状态,将所述图形上下文当前状态设置为默认值,并根据累积模式设置颜色掩码;
获取模块220,用于获取当前累积缓冲区与颜色缓冲区的相关信息,其中,所述相关信息至少包括存放图像的尺寸、格式和数据首地址;
上传模块230,用于创建两个纹理对象,将所述纹理对象分别绑定到纹理单元0和纹理单元1,并将累积缓冲区中图像上传至纹理单元0,将颜色缓冲区中图像上传至纹理单元1;
设置模块240,用于根据当前累积模式,将累积缓冲区或颜色缓冲区设置为GPU渲染目标;
可选的,所述设置模块包括:
设置单元240:用于当所述累积模式为GL_ACCUM、GL_LOAD、GL_MULT或GL_ADD时,将累积缓冲区设为GPU渲染目标;当所述累积模式为GL_RETURN时,将颜色缓冲区设为GPU渲染目标。
载入模块250,用于根据当前累积模式,载入特定的预备顶点着色器和片段着色器,以获得特定纹理贴图效果;
可选的,所述载入特定的片段着色器具体为:
若累积模式为GL_ACCUM时,则片段着色器的输出颜色值为:gl_FragColor=accumValue*texture2D(sampler0,vTexcoor0)+texture2D(sampler1,vT excoor1);
若累积模式为GL_LOAD时,则载入的片段着色器的输出颜色值为:gl_FragColor=accumValue*texture2D(sampler1,vTexcoor1);
若累积模式为GL_RETURN或GL_MULT时,则载入的片段着色器的输出颜色值为:gl_FragColor=accumValue*texture2D(sampler0,vTexcoor0);
若累积模式为GL_ADD时,则载入的片段着色器的输出颜色值为::gl_FragColor=accumValue+texture2D(sampler0,vTexcoor0);
其中,gl_FragColor为片段着色器最终输出的颜色值,accumValue为片段着色器的累积系数,函数texture2D(sampler0,vTexcoor0)表示返回纹理单元0在坐标vTexcoor0处的颜色采样值,函数texture2D(sampler1,vTexcoor1)表示返回纹理单元1在坐标vTexcoor1处的颜色采样值。
渲染模块260,用于GPU根据所述顶点着色器和所述片段着色器进行渲染,并将渲染结果存放到所述GPU渲染目标中。
可选的,执行绘制矩形命令,将所述矩形的4个顶点坐标设定为{-1.0,-1.0,1.0,1.0}、{1.0,-1.0,1.0,1.0}、{1.0,1.0,1.0,1.0}、{-1.0,1.0,1.0,1.0},其中,所述顶点坐标的格式表示为{x,y,z,w}。
将所述顶点坐标对应的纹理单元0和纹理单元1的纹理坐标,分别设定为{0.0,0.0}、{1.0,0.0}和{1.0,1.0}、{0.0,1.0},其中,所述纹理坐标的格式表示为{s,t}。
可选的,还包括:
恢复模块:用于恢复所述图形上下文当前状态。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各实施例的模块、单元和/或方法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。