本发明属于计算机图形学技术领域,涉及一种基于glcopypixels的gpu像素复制方法。
背景技术:
在图形处理器芯片(下简称gpu)设计中,openglapi定义的glcopypixels函数支持从缓冲区复制像素到缓冲区的一个新位置,但是opengl并没有定义当拷贝坐标在缓冲区外时,拷贝的像素该如何处理。gpu为了提升性能,在进行像素复制时是不会逐像素写入的,对于拷贝坐标、光栅坐标与缓冲区的多种位置关系,如何高性能的完成像素复制,并且不遗漏任何一种情况,也不会多复制不需要绘制的像素,这是需要解决的技术问题。
技术实现要素:
本发明目的是提供一种基于glcopypixels的gpu像素复制方法。
本发明的技术解决方案是:
提供了一种基于glcopypixels的gpu像素复制方法,该方法包括如下步骤:
1)拷贝范围参数计算:
2)光栅范围参数计算:
3)拷贝与光栅的位置比较:
4)从缓冲区拷贝数据:
5)图像管线处理:
6)余行处理。
进一步的,所述步骤1)为:
根据输入的拷贝坐标和宽高计算x和y方向正负的拷贝距离、拷贝起点坐标、拷贝起点tile坐标以及负方向的拷贝长度,
其中,tile表示4x4像素块,最左下角像素的x,y坐标均为4的整数倍。
进一步的,所述步骤2)为:
根据输入的原始光栅坐标和拷贝宽高计算实际复制长度、负方向的绘制长度;
当原始光栅坐标(x或y)在负的缓冲区,设置光栅坐标(x或y)为0;
否则,光栅坐标与原始光栅坐标相同;
最后,根据卷积使能和卷积模式对最终复制图像的宽高进行修正。
进一步的,所述步骤3)包括:
3.1)比较负方向的拷贝长度和绘制长度
计算负方向的拷贝长度和绘制长度的差值,即将复制在缓冲区内负区域的长度
当差值为负时,表示缓冲区内一部分像素不会被绘制,因此为了提升性能也不用复制这部分像素,因此重新计算拷贝坐标为新拷贝起点坐标,重新计算拷贝起点tile坐标为新拷贝起点tile坐标,并将负方向拷贝tile个数和新差值都赋值为0;
当差值为正时,表示所复制的像素都会被绘制,根据差值计算负方向的拷贝tile个数,新拷贝起点坐标与拷贝起点坐标相同,新拷贝起点tile坐标与拷贝起点tile坐标相同,新差值与差值相同;
其中,新拷贝起点坐标分别包含x和y的拷贝起点坐标,
新差值分别包含x方向的差值和y方向的差值;
3.2)比较实际复制长度与新差值
当实际复制长度小于新差值时,表示绘制在缓冲区内的都是负区域的像素,因此正方向拷贝tile个数赋值为0,然后根据实际复制长度计算新负方向拷贝tile个数,;
当实际复制长度大于新差值时,表示绘制在缓冲区内的有正区域的像素也有可能有负区域的像素,根据光栅坐标、实际复制长度以及新差值计算拷贝终点坐标,拷贝终点tile坐标,
再根据拷贝起点和终点tile坐标计算正方向拷贝tile个数,新负方向拷贝tile个数与负方向拷贝tile个数相同,
其中,拷贝终点坐标分别包含x和y的拷贝终点坐标,
正方向的拷贝tile个数分别包含x正方向和y正方向的拷贝tile个数,
新负方向拷贝tile个数分别包含x负方向和y负方向的拷贝tile个数;
3.3)计算拷贝tile个数
x方向的拷贝tile个数为x正方向的拷贝tile个数,
y方向的拷贝tile个数为y正方向的拷贝tile个数加y负方向的拷贝tile个数。
进一步的,所述步骤4)包括:
4.1)高度方向拷贝像素处理:
对于高度方向缓冲区外的像素处理,
y方向负的拷贝tile个数就是缓冲区外的需要拷贝的tile行个数,并且这些tile行像素赋值为0,
再根据y方向的差值计算tile行的起始位置;
对于高度方向缓冲区内的像素处理,
首先根据新拷贝起点tile坐标计算缓冲区内的tile坐标,
后根据缓冲区内的tile坐标从缓冲区读tile行像素,
再根据y负方向的拷贝tile个数、y的拷贝起点坐标和y的拷贝终点坐标计算tile行的起始和结束位置;
4.2)宽度方向拷贝像素处理:
处理x方向缓冲区外的拷贝像素,对每个tile行前补充x方向的差值个数的像素0。
进一步的,所述步骤5)为:
当y方向所有tile行全部绘制完成后,进入步骤6);
否则,对像素tile行进行管线上像素传输映射、缩放翻转、图像处理子集、片段操作及写到缓冲区,
当tile行完成管线处理后,重新进入步骤4)读取下一个tile行。
进一步的,所述步骤6)为:
当全部tile行处理完成后,判断图像复制行数是否全部完成,如果没有全部完成,则处理将由于开启卷积和卷积模式遗留的像素行在颜色表后的管线操作,
当图像复制行数全部处理完成后,glcopypixels的gpu像素复制结束。
本发明的有益效果:
本发明解决了gpu像素复制问题,考虑了拷贝坐标、光栅坐标与缓冲区的多种位置关系,精确计算两个坐标之间的关系,不会多复制不需要绘制的缓冲区像素。
正确并且高效的实现了针对openglapiglcopypixels的像素复制功能。
附图说明
图1为本发明的算法流程图;
具体实施方式
下面结合附图和具体实施例,对本发明的技术方案进行清楚、完整地表述。显然,所表述的实施例仅是本发明一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提所获得的所有其他实施例,都属于本发明的保护范围。
本发明提供了一种基于glcopypixels的gpu像素复制方法,该方法包括如下步骤:
1)拷贝范围参数计算:
根据输入的拷贝坐标和宽高计算x和y方向正负的拷贝距离、拷贝起点坐标、拷贝起点tile坐标以及负方向的拷贝长度,
其中,tile表示4x4像素块,最左下角像素的x,y坐标均为4的整数倍;
2)光栅范围参数计算:
根据输入的原始光栅坐标和拷贝宽高计算实际复制长度、负方向的绘制长度;
当原始光栅坐标(x或y)在负的缓冲区,设置光栅坐标(x或y)为0;
否则,光栅坐标与原始光栅坐标相同;
最后,根据卷积使能和卷积模式对最终复制图像的宽高进行修正。
3)拷贝与光栅的位置比较:
3.1)比较负方向的拷贝长度和绘制长度
计算负方向的拷贝长度和绘制长度的差值,
当差值为负时,重新计算拷贝坐标为新拷贝起点坐标,重新计算拷贝起点tile坐标为新拷贝起点tile坐标,并将负方向拷贝tile个数和新差值都赋值为0;
当差值为正时,计算负方向的拷贝tile个数,新拷贝起点坐标与拷贝起点坐标相同,新拷贝起点tile坐标与拷贝起点tile坐标相同,新差值与差值相同;
其中,新拷贝起点坐标分别包含x和y的拷贝起点坐标,
新差值分别包含x方向的差值和y方向的差值;
3.2)比较实际复制长度与新差值
当实际复制长度小于新差值时,计算新负方向拷贝tile个数;
当实际复制长度大于新差值时,根据光栅坐标、实际复制长度以及新差值计算拷贝终点坐标,拷贝终点tile坐标,
再根据拷贝起点和终点tile坐标计算正方向拷贝tile个数,新负方向拷贝tile个数与负方向拷贝tile个数相同,
其中,拷贝终点坐标分别包含x和y的拷贝终点坐标,
正方向的拷贝tile个数分别包含x正方向和y正方向的拷贝tile个数,
新负方向拷贝tile个数分别包含x负方向和y负方向的拷贝tile个数;
3.3)计算拷贝tile个数
x方向的拷贝tile个数为x正方向的拷贝tile个数,
y方向的拷贝tile个数为y正方向的拷贝tile个数加y负方向的拷贝tile个数。
4)从缓冲区拷贝数据:
4.1)高度方向拷贝像素处理:
对于高度方向缓冲区外的像素处理,
y方向负的拷贝tile个数就是缓冲区外的需要拷贝的tile行个数,并且这些tile行像素赋值为0,
再根据y方向的差值计算tile行的起始位置;
对于高度方向缓冲区内的像素处理,
首先根据新拷贝起点tile坐标计算缓冲区内的tile坐标,
后根据缓冲区内的tile坐标从缓冲区读tile行像素,
再根据y负方向的拷贝tile个数、y的拷贝起点坐标和y的拷贝终点坐标计算tile行的起始和结束位置;
4.2)宽度方向拷贝像素处理:
处理x方向缓冲区外的拷贝像素,对每个tile行前补充x方向的差值个数的像素0;
5)图像管线处理:
当y方向所有tile行全部绘制完成后,进入步骤6);
否则,对像素tile行进行管线上像素传输映射、缩放翻转、图像处理子集、片段操作及写到缓冲区,
当tile行完成管线处理后,重新进入步骤4)读取下一个tile行;
6)余行处理:
当全部tile行处理完成后,判断图像复制行数是否全部完成,如果没有全部完成,则处理将由于开启卷积和卷积模式遗留的像素行在颜色表后的管线操作,
当图像复制行数全部处理完成后,glcopypixels的gpu像素复制结束。
实施例:
下面结合附图对本发明做进一步详细描述,请参阅图1。
一种基于glcopypixels的gpu像素复制方法,包括以下步骤:
步骤一:拷贝范围参数计算:根据拷贝坐标和宽高计算原始拷贝终点坐标,当拷贝坐标小于缓冲区时,重置超出缓冲区的拷贝起点坐标x或y为0,如果原始拷贝终点坐标大于缓冲区,负方向的拷贝长度为起点坐标的绝对值,否则负方向的拷贝长度为输入拷贝长度。当拷贝坐标大于缓冲区时,负方向的拷贝长度为0,拷贝起点坐标与拷贝坐标相同。再根据拷贝起点坐标计算拷贝起点tile坐标。其中,tile表示4x4像素块,最左下角像素的x,y坐标均为4的整数倍;
步骤二:光栅范围参数计算:首先根据原始光栅坐标和拷贝宽高计算光栅终点坐标,如果原始光栅坐标小于缓冲区,并且光栅终点坐标也小于缓冲区,实际复制长度等于0;如果光栅终点坐标超出缓冲区边界,实际复制长度等于缓冲区分辨率,否则实际复制长度等于输入的光栅终点坐标;基于实际复制长度计算负方向的绘制长度以及设置光栅坐标为0。如果原始光栅坐标不小于缓冲区,光栅坐标与原始光栅坐标相同,负方向的绘制长度为0,如果光栅终点坐标超出缓冲区边界,实际复制长度等于缓冲区分辨率减光栅坐标,否则实际复制长度等于输入的拷贝长度。最后,根据卷积使能和卷积模式对最终复制图像的宽高进行修正。
步骤三:拷贝与光栅的位置比较:
3.1)比较负方向的拷贝长度和绘制长度
计算负方向的拷贝长度和绘制长度的差值,当差值为负时,拷贝起点坐标加差值的绝对值为新拷贝起点坐标,根据新拷贝起点坐标计算新拷贝起点tile坐标,负方向拷贝tile个数为0,并将新差值设置为0。当差值不为负时,根据差值计算负方向的拷贝tile个数,新拷贝起点坐标与拷贝起点坐标相同,新拷贝起点tile坐标与拷贝起点tile坐标相同,新差值与差值相同。其中,新拷贝起点坐标分别包含x和y的拷贝起点坐标,新差值分别包含x方向的差值和y方向的差值。
3.2)比较实际复制长度与新差值
当实际复制长度小于新差值时,正方向拷贝tile个数为0,根据实际复制长度计算新负方向拷贝tile个数;当实际复制长度大于新差值时,根据光栅坐标、实际复制长度以及新差值计算拷贝终点坐标,拷贝终点tile坐标,再根据拷贝起点和终点tile坐标计算正方向拷贝tile个数,新负方向拷贝tile个数与负方向拷贝tile个数相同。其中,拷贝终点坐标分别包含x和y的拷贝终点坐标,正方向的拷贝tile个数分别包含x正方向和y正方向的拷贝tile个数,新负方向拷贝tile个数分别包含x负方向和y负方向的拷贝tile个数;
3.3)计算拷贝tile个数
x方向的拷贝tile个数为x正方向的拷贝tile个数,y方向的拷贝tile个数为y正方向的拷贝tile个数加y负方向的拷贝tile个数。
步骤四:从缓冲区拷贝数据:
4.1)高度方向拷贝像素处理:对于高度方向缓冲区外的像素处理,y方向负的拷贝tile个数就是缓冲区外的需要拷贝的tile行个数,并且这些tile行像素赋值为0,再根据y方向的差值计算tile行的起始位置,结束位置设置为4;对于高度方向缓冲区内的像素处理,首先根据新拷贝起点tile坐标计算缓冲区内的tile坐标,后根据缓冲区内的tile坐标从缓冲区读tile行像素,再根据y负方向的拷贝tile个数、y的拷贝起点坐标和y的拷贝终点坐标计算tile行的起始和结束位置;
4.2)宽度方向拷贝像素处理:
处理x方向缓冲区外的拷贝像素,对每个tile行前补充x方向差值个数的像素0;
步骤五:图像管线处理:
当y方向所有tile行全部绘制完成后,进入步骤6);否则,对像素tile行进行管线上像素传输映射、缩放翻转、图像处理子集、片段操作及写到缓冲区,当tile行完成管线处理后,重新进入步骤4)读取下一个tile行;
步骤六:余行处理:当全部tile行处理完成后,判断图像复制行数是否全部完成,如果没有全部完成,则处理将由于开启卷积和卷积模式遗留的像素行在颜色表后的管线操作,当图像复制行数全部处理完成后,glcopypixels的gpu像素复制结束。