一、加载纹理
1、生成纹理索引。
用到的函数:
static void glGenTextures(int n, IntBuffer textures)
static void glGenTextures(int n, int[] textures, int offset)
例如:
int texture[ ] = new int[1];
gl.glGenTextures(1, texture,0);
2、将索引与纹理绑定。
用到的函数:
static void glBindTexture(int target, int texture)
例如:
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[0]);
3、对该纹理进行过滤设置。
用到的函数:
static void glTexParameterf(int target, int pname, float param)
static void glTexParameterx(int target, int pname, int param)
例如:
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,GL10.GL_CLAMP_TO_EDGE);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,GL10.GL_CLAMP_TO_EDGE);
4、使用Bitmap图片生成纹理。
用到的函数:
texImage2D(int target, int level, Bitmap bitmap, int border)
该函数有多个实现。
代码示例:
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0,bitmap, 0);
其中bitmap为Android中的Bitmap的实例。在加载之后释放bitmap本地对象。
代码示例:
badlogic.recycle();
通过以上四步操作,成功加载了一张纹理。
二、使用纹理
1、开启纹理状态。
gl.glEnable(GL10.GL_TEXTURE_2D);
2、开启纹理数组功能。
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
3、指定纹理数组
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, _textureBuffer);
4、绑定纹理
gl.glBindTexture(GL10.GL_TEXTURE_2D, texID);
5、绘制图形
6、关闭纹理数组状态以及纹理状态
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glDisable(GL10.GL_TEXTURE_2D);
通过以上几步操作,可以将纹理绑定在一个图形上,当然在这之前以及对纹理坐标数组进行了初始化,这里不做考虑
3、纹理坐标需要注意的一点。
a、纹理坐标数组的顺序是按照顶点数组中的顶点顺序来编写的,而不是按照顶点索引数组中的顺序来编写的。
b、Android和OpenGL中,对一张图片的纹理编号是不同的,
在OpenGL中,纹理的起点坐标为左下角(0,0)、右下角(1,0)、右上角(1,1)、左上角(0,1)。
而Android中, 纹理的起点坐标为左上角(0,0)、右上角(1,0)、右下角(1,1)、左下角(0,1)。
Android中的纹理坐标和OpenGl中的纹理坐标,刚好是180°倒立的,如果按照OpenGL中的纹理坐标规则的话 ,那么贴出了的纹理将是倒立的。