应用纹理贴图
文章目录
1、纹理的基本概念
🌲 纹理(TEXTURE),即物体表面的样子。通常我们通过纹理映射将物体表面图片贴到物体的几何图形上面,完成贴图的过程,将物体从现实世界中模拟到虚拟世界中。
🌲 纹理贴图就是把一个纹理(对于2D贴图,可以简单的理解为图片),按照所期望的方式显示在诸多三角形组成的物体的表面。
说明:在使用纹理贴图时,需要准备一张纹理图片,建议该图片的长宽是2的N次方,例如,可以是256*256的图片,也可以是512*512的图片。在内部,如果贴图尺寸不符合上述规定的话,系统会自动调节它们的大小,这样就有可能是占用比图片本身尺寸还要大的图片。
2、纹理坐标
🌲 启用纹理映射功能后,如果想把一副纹理应用到相应的几何图元,就必须告知渲染系统如何进行纹理的映射。告知的方式就是为图元汇总的顶点指定恰当的纹理坐标
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
🌲官方OpenGL纹理坐标在x和y轴上,范围为0到1之间(注意我们使用的是2D纹理图像)。使用纹理坐标获取纹理颜色叫做采样(Sampling)。纹理坐标起始于(0, 0),也就是纹理图片的左下角,终始于(1, 1),即纹理图片的右上角。
🌲注意:纹理坐标和顶点坐标不同,没有负数。是在图片的左下角开始为原点。顶点坐标是在中间位置为原点。
🌲 Android使用的opengl es的纹理坐标系跟官方的opengl 纹理坐标系统不一样; 左上角(0,0),右下角(1,1);向右为S轴,向下为T轴
2.1坐标映射
纹理坐标系的两个维度的范围都在[0,1]之间。无论是使用纯色渲染,还是图片渲染,实际上都是在进行颜色渲染,最终都需要将那块颜色映射到标准化设备坐标系中。而标准化设备坐标系中两个维度都是在[-1,1]之间。由于这种坐标系的不一致,就需要将纹理坐标系中的图片映射到标准化设备坐标系中。这里,首先我们会遇到两个问题:
-
将纹理坐标系中的哪个区域块取出来进行映射。
-
取出来的区域块又该如何如何对应到标准化设备坐标系中通过顶点定义的外形中。
如上图所示,我们可以得到以下几点:
要选取图片中的哪个区域是由我们通过纹理顶点坐标定义的。上图中,我们通过定义(0,0),(0,1),(1,1),(1,0),实际上选取了整个图片部分作为贴片。
要进行贴图的部分定义好了,它所要贴到的地方,实际上和我们定义的顶点坐标按照定义顺序一一对应(映射)。即,我们定义的第一个纹理顶点坐标,对应我们定义的第一个顶点坐标。
3、纹理映射的步骤是
1. 启用纹理映射功能
在默认设置中,纹理映射是关闭的,启用的参数是 GL_TEXTURE_2D,还有其他的参数: GL_TEXTURE_1D, GL_TEXTURE_3D, GL_TEXTURE_CUBE_MAP。
操作方法:gl.glEnable(GL_TEXTURE_2D)
2.创建纹理对象
获得新创建的纹理对象id
gl.glGenTextures(int n,int[] textures,int offset)
🌲 n:需要生成的纹理对象个数;
🌲 textures:保存生成所有纹理对象的数组;
🌲 offset:纹理对象数组的偏移(生成的纹理从数组什么位置开始赋值);
gl.glGenTextures(int n,java.nio.IntBuffer textures);
🌲 创建 n 个纹理,并将纹理ID 放在 textures 中;
3. 设置纹理属性
绑定纹理后,我们就可以对绑定的纹理进行基本属性设置,比如放大、缩小时的纹理过滤以及纹理环绕
操作方法:void glTexParameteri(int target,int pname,int param);
🌲 target:纹理单元目标类型,表示我们激活的纹理单元对应了什么样的操作类型,比如GL_TEXTURE_1D、GL_TEXTURE_2D等。
🌲 pname:属性名称;
🌲 param:属性值;