Android OpenGL中的纹理

来源:互联网 发布:解压缩软件官方win10 编辑:程序博客网 时间:2024/03/28 20:01

一、加载纹理

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中的纹理坐标规则的话 ,那么贴出了的纹理将是倒立的。

原创粉丝点击