11 纹理数组
现实世界中的物体由不同的材质组成,表面可能会有不同的花纹,这些特性在模拟的3D世界中无法通过简单的平面实现。为了更好地在3D世界中模拟现实物体,设计人员引入了纹理的概念,主要思路是通过2维图片绘制类似于某种材质表面的图像,然后将2维图片贴附在平面上,形成与现实物体类似的表面。
在OpenGL中使用特定方法为某个平面指定纹理,然而在OpenGL ES中,为了节省资源,只提供了指定纹理数组的方法glTexCoordPointer()。纹理数组的使用和法向量数组的使用类似,通过一个数组为不同的顶点指定纹理参数,由系统计算出纹理图片在模型表面的展现形式。
在详细了解纹理数组的使用之前,首先需要了解在OpenGL ES中使用纹理数组的前提条件。
为了使用纹理数组,开发人员首先要启动纹理支持,纹理支持的启动通过在glEnable方法中使用GL10.GL_TEXTURE_2D实现。OpenGLDemo 样例中,该方法在CubeRenderer的contextCreated方法中调用:
gl.glEnable(GL10.GL_TEXTURE_2D);
参数GL10.GL_TEXTURE_2D表示使用2维纹理。在OpenGL中,纹理可以是一维的,也可以是二维的或者是三维的。一维纹理就像一条线,可以认为是宽度为1的二维纹理,一般使用在边框等细长的表面上。二维纹理像是一张图,使用于模型的表面。三维纹理则像一个立方体,可以指定立方体内任一点的纹理特点。三维纹理可以作用于模型内部,使用这种纹理后对模型取一个截面仍能看到纹理效果,这是二维纺理所不能做到的。
对于一维纹理,需要时可以通过二维纹理来实现,而三维纹理对于嵌入设备而言太过于复杂,所以在OpenGL ES中只支持二维纹理。虽然在OpenGL ES中只支持二维纹理,在使用它之前还是需要通过方法glEnable(GL10.GL_TEXTURE_2D)显式地启用它。
启用纹理支持后需要创建纹理所使用的图片,一些简单的纹理图片可以直接通过程序计算得出,比如黑白相间的国际象棋棋盘这样的图片,而复杂的纹理图片一般都通过导入图像资源的方式实现,如实例中使用的BlackBerry的图标。
CubeRenderer的contextCreated中的以下方法导入了资源文件夹中名为“BlackBerry.png”的图片。