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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Android中使用OpenGL ES 3.0加载纹理有以下步骤: 1. 初始化OpenGL ES环境:在OpenGL ES操作前,需要初始化OpenGL ES环境,创建GLSurfaceView实例,并设置渲染器。 2. 创建纹理对象:使用OpenGL ES函数glGenTextures生成纹理对象ID,并绑定到当前活动的纹理单元。 3. 加载纹理图像:通过Android的Bitmap对象加载纹理图像,可以使用BitmapFactory类的decodeResource方法从资源中加载或使用Bitmap类的createBitmap方法动态创建。调用glTexImage2D将图像数据传输到纹理对象中。 4. 设置纹理过滤器:可以使用glTexParameteri函数设置纹理的放大缩小过滤器,如GL_LINEAR或GL_NEAREST。 5. 设置纹理包裹模式:可以使用glTexParameteri函数设置纹理的包裹模式,如GL_CLAMP_TO_EDGE或GL_REPEAT。 6. 加载纹理坐标:通过定义纹理坐标数组,确定纹理映射到对象的哪个部分。在顶点着色器中使用纹理坐标进行纹理采样。 7. 绘制纹理:在绘制OpenGL场景时,通过在顶点着色器和片段着色器中使用纹理坐标,并利用纹理采样器将纹理应用到对象上。 8. 释放纹理资源:当纹理不再使用时,需要调用glDeleteTextures函数释放纹理对象。 总之,使用OpenGL ES 3.0加载纹理需要创建纹理对象、加载纹理图像、设置纹理过滤器与包裹模式、加载纹理坐标,并在绘制时通过纹理采样器将纹理应用到对象上。记得释放纹理资源,以避免内存泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值