正方体的纹理贴图步骤如下:
1.数组
1.1:顶点数组
1.2:三角形
1.3:贴图数组
关于数组的设置请看上篇博客http://blog.csdn.net/zhangjikuan/article/details/23126639
2.onSurfaceChanged:与3D的一样
3.onSurfaceCreated:需要添加东西
3.1允许2D贴图gl.glEnable(GL10.GL_TEXTURE_2D);
3.2生成几个纹理,每个面都贴图的话就要生成六个纹理,gl.glGenTextures(6, textureBuffer); //一次性生成几个 纹理,放到数组中,但是这时纹理和图片还没结合在一起
3.3将纹理绑定到目标上gl.glBindTexture(GL10.GL_TEXTURE_2D, tex_id[i]);
3.4加载视图生成纹理GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp[i], 0);
3.5设置目标纹理属性gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_LINEAR);
注:3.3-3.5:生成几个纹理就绑定几个
4.onDrawFrame
4.1启动纹理功能,与开启颜色渲染一样gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
4.2设置贴图坐标数据 gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, BufferUtil.iBuffer(texCoords));
4.3绘制立方体并绑定纹理(绑定一个面的纹理对应的画出那个面)
这是为正方体的每个面贴一张不同的图片的程序,注意事项都在注释中写明,关于坐标设置请看上篇
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
//清楚屏幕和深度缓存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
//重置当前的观察模型矩阵
gl.glLoadIdentity();
//现将屏幕向里移动,用来画正方体
gl.glTranslatef(0.0f, 0.0f, -6.0f);
if(bAutoRotate)
{
rotateX+=0.5;
rotateY+=0.6;
//rotateZ+=0.3;
}
//设置3个方向的旋转
gl.glRotatef(rotateX, 1.0f, 0.0f, 0.0f);
gl.glRotatef(rotateY, 0.0f, 1.0f, 0.0f);
gl.glRotatef(rotateZ, 0.0f, 0.0f, 1.0f);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
//纹理的使用与开启颜色渲染一样,需要开启纹理功能
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
//设置正方体 各顶点 数据和贴图坐标数组,第一个参数都是代表几个元素设定一个顶点,顶点是三个xyz,贴图是两个xy(因为是二维贴图
gl.glVertexPointer(3, GL10.GL_FIXED, 0, BufferUtil.iBuffer(quarter)); //注意:这个地方的第二个参数是关于坐标数据类型的,根据顶点数据和纹理数据坐标的数据类型而改变,如果是FL_FLOAT的话数据类型就是float的,以前我写的OpenGL版本都是float的
gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, BufferUtil.iBuffer(texCoords));
// 绘制立方体并绑定纹理
gl.glBindTexture(GL10.GL_TEXTURE_2D, tex_id[0]);
gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 4, GL10.GL_UNSIGNED_BYTE, indices1);
gl.glBindTexture(GL10.GL_TEXTURE_2D, tex_id[1]);
gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 4, GL10.GL_UNSIGNED_BYTE, indices2);
gl.glBindTexture(GL10.GL_TEXTURE_2D, tex_id[2]);
gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 4, GL10.GL_UNSIGNED_BYTE, indices3);
gl.glBindTexture(GL10.GL_TEXTURE_2D, tex_id[3]);
gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 4, GL10.GL_UNSIGNED_BYTE, indices4);
gl.glBindTexture(GL10.GL_TEXTURE_2D, tex_id[4]);
gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 4, GL10.GL_UNSIGNED_BYTE, indices5);
gl.glBindTexture(GL10.GL_TEXTURE_2D, tex_id[5]);
gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 4, GL10.GL_UNSIGNED_BYTE, indices6);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
//当窗口改变时,调用,至少在创建窗口时调用一次,这边设置下场景大小
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
//设置OpenGL场景大小
float ratio = (float) width / height;
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);//设置为投影矩阵模式
gl.glLoadIdentity();//重置
gl.glFrustumf(-ratio, ratio, -1, 1, 2, 10);//设置视角
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}
//当窗口被创建时我们可以做些初始化工作
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
//设置清除屏幕时所用的颜色,参数依次为红、绿、蓝、Alpha值
gl.glClearColor(0, 0, 0, 0);
gl.glEnable(GL10.GL_CULL_FACE);
//启用阴影平滑
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glEnable(GL10.GL_DEPTH_TEST);//启用深度测试
//以下是关于深度缓存的设置,非常重要
gl.glClearDepthf(1.0f);//设置深度缓存
gl.glDepthFunc(GL10.GL_LEQUAL);//所做深度测试的类型
//告诉系统对透视进行修正
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
//允许2D贴图
gl.glEnable(GL10.GL_TEXTURE_2D);
//gl.glGenTextures(6, tex_id, 0);
IntBuffer textureBuffer = IntBuffer.allocate(6);
gl.glGenTextures(6, textureBuffer); //一次性生成几个纹理,放到数组中,但是这时纹理和图片还没结合在一起
tex_id = textureBuffer.array();
for(int i = 0; i < 6; i++)
{
//将纹理绑定到目标GL10.GL_TEXTURE_2D上
gl.glBindTexture(GL10.GL_TEXTURE_2D, tex_id[i]);
//为目标纹理GL10.GL_TEXTURE_2D放上图片
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp[i], 0);
//设置目标纹理属性
gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
}
}
}