Android OpenGL ES正方体纹理贴图(每个面一张)

正方体的纹理贴图步骤如下:

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);  
       }  
         
   } 
}  

你可能感兴趣的:(android-OpenGL,ES)