首页 > 技术文章 > OpenGL ES 2.0 纹理映射

msnow 2016-03-19 10:35 原文

纹理坐标用符点数表示,范围一般从0.0到1.0,在纹理坐标系中。纹理坐标系原点在左上侧,向右为S轴,向下为T轴。两个轴的取值范围都是0.0~1.0。

纹理映射

纹理映射:把一幅纹理图应用到相应的几何图元。

如:一个三角形图元,其3个顶点指定了纹理坐标,3组纹理坐标在右侧的纹理图中确定了需要映射的三角形纹理区域。

纹理映射的基本思想就是首先为图元中的每个顶点指定恰当的纹理坐标,然后通过纹理坐标在纹理图中可以确定选中的纹理区域,最后将选中纹理区域中的内容根据纹理坐标映射到指定的图元上。

纹理的过程实际上就是为右侧三角形图元中的每一片元着色,用于着色的颜色需要从左侧的纹理图中提取,具体过程如下:

  • 首先图元中的每顶点都需要在顶点着色器中通过易变变量将作纹理坐标传入片元着色器。
  • 经过顶点着色器后渲染管线的固定功能部分会根据情况进行插值计算,产生对应到每个片元的用于记录纹理坐标的易变变量值。
  • 最后每个片元在片元着色器中根据其接收到的记录纹理坐标的易变变量值到纹理图中提取出对应位置的颜色即可,提取颜色的过程一般称之为纹理采样。

纹理拉伸

1.重复拉伸;2.截取拉伸

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_REPEAT);//设置S轴拉伸方式为重复
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_REPEAT);//设置T轴拉伸方式为重复
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_CLAMP_TO_EDGE);//设置S轴拉伸方式为截取拉伸
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_CLAMP_TO_EDGE);//设置T轴拉伸方式为截取拉伸

纹理采样

纹理采样:根据片元的纹理坐标到纹理图中提取对应位置颜色的过程。

1.最近点采样;2.线性采样

 

最近点采样

基本原理:对应像素点

优点:简单,采样最快。

缺点:将小图映射到较大的图元时,会产生明显的锯齿。

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_NEAREST);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_NEAREST);

 

线性采样

基本原理:加权平均

优点:平滑过渡。

缺点:有时线条边缘会比较模糊。

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_LINEAR);

 

MIN与MAG采样

当纹理图中的一个像素对应到待映射图元上的多个片元时,采用MAG采样;反之则采用MIN采样。

通俗的是纹理比图元小,采用MAG采样纹理设置。

配合:MIN与最近点,MAG与线性采样

 

mipmap纹理技术

基本思想:对远处的地形采用尺寸较小分辨率低的纹理,近处的采用尺寸较大分辨率高的纹理。

开发人员只需要提供一幅原始纹理图,系统会在纹理加载时自动生成一系列由大到小的纹理图。每幅图是前一幅的1/2,直至纹理图尺寸缩小到1x1。一系列纹理图中的第一副就是原始纹理图。一系列的mipmap纹理图占用的空间接近原始纹理图的2倍。

 

多重纹理和过程纹理

多重纹理:对同一个图元采用多幅纹理图。

平滑过渡:在多重纹理变化的边界根据某种规则进行平滑过渡。

 

将2D纹理映射到3D上:拓扑变换

 

推荐阅读