纹理的应用

1.纹理坐标

纹理坐标的范围是0到1的浮点数所组成的三维空间坐标系,每个坐标点对应四个分量,分别为s,t,r,q。其中s,t,r为存储在内存中或者颜色缓冲区的纹理单元的位置,通过指定的纹理坐标可以对相应的纹理单元进行取样,进而完成贴图。q分量相当于OpenGL中顶点坐标的w值,相当于缩放因子,对一些阴影效果或者高级纹理贴图会应用到,默认值为1。

2.纹理参数

在通过纹理坐标得到纹理单元的样本后,为我们要完成的贴图准备了基本的素材,但在贴图工作之前我们还要做一些准备工作,为此我们要指定贴图的方式和贴图的行为,这是通过一些纹理参数去指定的。
比如说当我们通过纹理坐标取到对应的纹理纹理单元样本后,将纹理坐标应用到对应的顶点坐标完成贴图,我们会发现贴上去的纹理图片会发生拉伸或者压缩的现象,这是因为纹理单元是很难与像素一一对应的,这时候就需要进行对纹理进行过滤,其实过滤可以认为是通过对压缩或者收缩的纹理贴图计算颜色片段的过程

1.基本过滤

基本过滤分为最邻近过滤和线性过滤两种
-最邻近过滤
其中最邻近过滤可以理解为纹理坐标位于哪个纹理单元,哪个为单元就作为这个颜色片段的颜色值,这样简单粗暴的解决纹理单元与像素不能一一的对应的关系,但是这样做有一个确定,就是这种一一对应有可能是不匹配的一一对应,这样就可能导致贴图贴图后出现像素斑驳的现象。
-线性过滤
线性过滤可以解决最邻近过滤可能出现斑驳的现象,线性过滤相对于最邻近过滤做了额外的操作,线性过滤是将纹理坐标位于的那个纹理单元的周围纹理单元进行加权平均计算后应用到这个纹理坐标,而为了使得到的这个插值片段与纹理片段更匹配,我们需要将纹理坐标准确的落在相应的纹理单元中间。这样也需要额外的一些计算。
这两种基本过滤都可以通过设置纹理参数相关函数实现

2.纹理环绕

在通过纹理过滤后我们通过纹理坐标得到相对准确的颜色片段,这时候我们还应该指定这段颜色片段才用哪种形式进行排布,这时候就需要设置纹理环绕方式了。
纹理坐标的范围是0.0到1.0之间,纹理坐标的值会与纹理单元之间形成映射关系,但是当纹理坐标落在纹理单元之外时,这时候OpenGL就会才用环绕模式处理这类问题,我们可以指定沿着哪个坐标轴进行环绕,也可以指定哪种环绕模式。
GL_REPEAT在字面理解为重复环绕,当纹理坐标落在纹理单元之后后,重复的对这个纹理单元进行取样,具体到应用可以理解为简单的重复平铺,当小型的纹理应用到大型的几何体这种效果比较试用。
GL_CLAMP平铺模式,可以理解为剪裁环绕。当需要对一大块区域进行纹理处理时,如果只选用单个纹理,可能会由于过大而无法载入内存,这时候可以用剪裁环绕,首先OpenGL会将单个纹理进行分割进行平铺处理。切割时对纹理坐标范围之外的纹理单元采用GL_CLAMP_EDGE平铺模式,对沿着纹理坐标合法的纹理单元最后一行或者一列进行采样。对于纹理坐标外围之外的纹理单元,采用GL_CLAMP_BORDER模式,这样边界纹理单元成为合法的纹理单元的额外的行和列呗应用。
需要注意的是当选用最邻近滤波时,GL_REPEAT是不起作用的,因为GL_REPEAT环绕时在处理边界是取得上一行或列的颜色平局值来处理边界的衔接,而最邻近滤波取得是特定的纹理单元,这样也避免了线性滤镜需要取周围颜色进行加权的问题。

void glTexParameTerf(GLenum target, GLenum panem, GLfloat param )

第一个参数制动应用哪种纹理模式,第二个参数指定了设置了哪种纹理参数,比如说我们应用纹理过滤设置纹理参数时时可以指定是放大过滤或缩小过滤的一种,第三个为设置了特定纹理参数的值。比如说我们应用纹理过滤时可以指定是最邻近过滤或线性过滤的一种。

你可能感兴趣的:(纹理的应用)