本发明属于计算机图形学技术领域,涉及一种gpu纹素取值方法。
背景技术:
在图形处理器芯片(下简称gpu)设计中,根据纹素地址进行纹素颜色的取值,opengl2.0定义了纹理贴图纹素地址计算方法,但是纹素地址计算考虑因素较多,包括了纹理坐标环绕模式、缩小\放大纹理的过滤模式、纹理边框设置等,opengl2.0定义的算法细节不清楚特别是在纹素地址在边缘或者超过边界情况下,实现出来的效果与目前商用平台效果差异较大。如何达到符合标准规定的纹素地址,并且纹理贴图效果又与目前商用平台一致或者靠近,这是需要解决的技术问题。
技术实现要素:
本发明目的是提供一种gpu纹素取值方法。
本发明的技术解决方案是:
一种gpu纹素取值方法,该方法包括如下步骤:
(1)根据环绕模式对纹理坐标的修正和范围标记;
(2)根据过滤模式对纹素地址的修正;
(3)根据边框对纹素地址的修正;
(4)纹素取值。
进一步的,
所述(1)包括:
首先判断当前纹理坐标的环绕模式,
如果环绕模式是gl_clamp或gl_repeat,那么参照opengl2.0对各自环绕模式的坐标进行修正,并且纹理范围标记为false;
如果是其他的环绕模式,那么先参照opengl2.0计算各自环绕模式的坐标范围;
对于超过范围的坐标设置纹理范围标记为true;
否则为false;
最后对纹理坐标进行范围截取。
进一步的,所述(2)包括判断过滤模式,若是gl_nearest类,则对于(1)中所得的纹理坐标进行判断,
如果纹理坐标大于1.0的纹素地址,纹素地址取值为纹理图像维度;
如果纹理坐标不大于1.0,则参照opengl2.0标准进行纹素地址计算。
进一步的,所述(2)包括判断过滤模式,若是gl_linear类,则,
首先基于(1)中计算所得纹理坐标,参照opengl2.0标准进行第1个纹素地址计算,再判断环绕模式,
gl_clamp,如果第1个纹素地址小于0,将第1个纹素地址赋值给第2个纹素地址,并将第1个纹素地址赋值为0;其他情况参照opengl2.0标准进行第2个纹素地址计算;
gl_repeat,如果第1个纹素地址小于0,将第1个纹素地址为0,第2个纹素地址为纹理图像维度减1,其他情况参照opengl2.0标准进行第2个纹素地址计算;
gl_clamp_to_border,判断纹理坐标范围标记,如果为true,进将第1个纹素地址赋值给第2个纹素地址,如果false,处理方式同gl_clamp;
gl_clamp_to_edge/gl_mirrored_repeat,判断纹理坐标范围标记,如果为true,将第1个纹素地址赋值给第2个纹素地址,如果false,参照opengl2.0标准进行第2个纹素地址计算。
进一步的,所述(3)中修正方法为(2)中所得纹素地址加边框值为修正后的纹素地址。
进一步的,所述(4)中根据修正后的纹素地址设置此纹素取值,
如果修正后的纹素地址在纹理图像范围(此纹理图像范围要考虑边框设置的影响)外,此标志为fasle,表明此纹素取设置的边框颜色常量;
如果修正后的纹素地址在范围内,此标志为true,表明此纹素取对应纹素地址的纹理图像,并根据纹素地址进行纹理图像的取值。
本发明的有益效果:
本发明解决了gpu的纹素取值问题,包括纹理坐标环绕模式、缩小\放大纹理的过滤模式、纹理边框设置等各自因素的影响。
本发明完善了标准未提及的多种情况,既符合标准规定的纹素地址计算规则,也与目前商业大部分平台贴图效果保持一致。
附图说明
图1为本发明的算法流程图;
具体实施方式
下面结合附图和具体实施例,对本发明的技术方案进行清楚、完整地表述。显然,所表述的实施例仅是本发明一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提所获得的所有其他实施例,都属于本发明的保护范围。
本发明提供了一种gpu纹素取值方法,该方法包括以下步骤:
1)根据环绕模式对纹理坐标的修正和范围标记:
首先判断当前纹理坐标的环绕模式,如果环绕模式是gl_clamp或gl_repeat,那么参照opengl2.0对各自环绕模式的坐标进行修正,并且纹理范围标记为false;如果是其他的环绕模式,那么先参照opengl2.0计算各自环绕模式的坐标范围,对于超过范围的坐标设置纹理范围标记为true,否则为false,最后对纹理坐标进行范围截取。
2)根据过滤模式对纹素地址的修正:
2.1)环绕模式是gl_nearest类:
那么对于纹理坐标大于1.0的纹素地址,取值为纹理图像维度,其余参照opengl2.0标准进行纹素地址计算。
2.2)环绕模式是gl_linear类:
首先参照opengl2.0标准进行第1个纹素地址计算,再判断环绕模式:
gl_clamp,如果第1个纹素地址小于0,将第1个纹素地址赋值给第2个纹素地址,并将第1个纹素地址赋值为0;其他情况参照opengl2.0标准进行第2个纹素地址计算。
gl_repeat,如果第1个纹素地址小于0,将第1个纹素地址为0,第2个纹素地址为纹理图像维度减1,其他情况参照opengl2.0标准进行第2个纹素地址计算。
gl_clamp_to_border,判断纹理坐标范围标记,如果为true,进将第1个纹素地址赋值给第2个纹素地址,如果false,处理方式同gl_clamp。
gl_clamp_to_edge/gl_mirrored_repeat,判断纹理坐标范围标记,如果为true,将第1个纹素地址赋值给第2个纹素地址,如果false,参照opengl2.0标准进行第2个纹素地址计算。
3)根据边框对纹素地址的修正:
修正方法为纹素地址加边框值为修正后的纹素地址。
4)纹素取值:
根据纹素地址设置此纹素取值,如果纹素地址在纹理图像范围(此纹理图像范围要考虑边框设置的影响)外,此标志为fasle,表明此纹素取设置的边框颜色常量;如果纹素地址在范围内,此标志为true,表明此纹素取对应纹素地址的纹理图像,并根据纹素地址进行纹理图像的取值。
实施例:
下面结合附图对本发明做进一步详细描述,请参阅图1。
一种gpu纹素取值方法,该方法包括如下步骤:
步骤1、根据环绕模式对纹理坐标的修正和范围标记;
首先判断当前纹理坐标的环绕模式,
如果环绕模式是gl_clamp或gl_repeat,那么参照opengl2.0对各自环绕模式的坐标进行修正,并且纹理范围标记为false;
如果是其他的环绕模式,那么先参照opengl2.0计算各自环绕模式的坐标范围;
对于超过范围的坐标设置纹理范围标记为true;
否则为false;
最后对纹理坐标进行范围截取。
步骤2、根据过滤模式对纹素地址的修正;
判断过滤模式,
若是gl_nearest类,则对于步骤1中所得的纹理坐标进行判断,
如果纹理坐标大于1.0的纹素地址,纹素地址取值为纹理图像维度;
如果纹理坐标不大于1.0,则参照opengl2.0标准进行纹素地址计算;
若是gl_linear类,则,
首先基于步骤1中计算所得纹理坐标,参照opengl2.0标准进行第1个纹素地址计算,再判断环绕模式,
gl_clamp,如果第1个纹素地址小于0,将第1个纹素地址赋值给第2个纹素地址,并将第1个纹素地址赋值为0;其他情况参照opengl2.0标准进行第2个纹素地址计算;
gl_repeat,如果第1个纹素地址小于0,将第1个纹素地址为0,第2个纹素地址为纹理图像维度减1,其他情况参照opengl2.0标准进行第2个纹素地址计算;
gl_clamp_to_border,判断纹理坐标范围标记,如果为true,进将第1个纹素地址赋值给第2个纹素地址,如果false,处理方式同gl_clamp;
gl_clamp_to_edge/gl_mirrored_repeat,判断纹理坐标范围标记,如果为true,将第1个纹素地址赋值给第2个纹素地址,如果false,参照opengl2.0标准进行第2个纹素地址计算。
步骤3、根据边框对纹素地址的修正;
在步骤2中所得纹素地址加边框值为修正后的纹素地址
步骤4、纹素取值;
根据修正后的纹素地址设置此纹素取值,
如果修正后的纹素地址在纹理图像范围(此纹理图像范围要考虑边框设置的影响)外,此标志为fasle,表明此纹素取设置的边框颜色常量;
如果修正后的纹素地址在范围内,此标志为true,表明此纹素取对应纹素地址的纹理图像,并根据纹素地址进行纹理图像的取值。