当前位置:操作系统 > 安卓/Android >>

GL_TRIANGLE_STRIP之纹理贴图

一、基础知识:

GL_TRIANGLE_STRIP比GL_TRIANLGES 快100% ~ 200%。
建议:尽可能地使用GL_TRIANGLE_STRIP替代GL_TRIANGLES。

二、使用方法:

1.首先以框架入手,我们一般在Android上画一个3D的图形,需要在MainActivity的OnCreate函数中加入如下代码,用来进入我们的3D场景界面:

[java]
glView = new GLSu易做图ceView(this);       // 创建一个GLSu易做图ceView  
glView.setRenderer(new MyGLRenderer(this)); // 使用定制的渲染器  
 setContentView(glView);                         

       glView = new GLSu易做图ceView(this);  // 创建一个GLSu易做图ceView
       glView.setRenderer(new MyGLRenderer(this)); // 使用定制的渲染器
        setContentView(glView);      其中,glView为GLSu易做图ceView glView的引用对象,在MainActivity中的成员变量中声明:

[java]
private GLSu易做图ceView glView;   // 使用GLSu易做图ceView  

private GLSu易做图ceView glView; // 使用GLSu易做图ceView 


2.接下来实现3D场景中的绚烂器(GLSu易做图ceView.Renderer):

[java]
public class MyGLRenderer implements  GLSu易做图ceView.Renderer { 
  // 实现代码  

public class MyGLRenderer implements  GLSu易做图ceView.Renderer {
  // 实现代码
}
①构造函数的编写:

[java]
/ Constructor with global application context  
public MyGLRenderer(Context context) { 
    this.context = context; 
     
    // 设置所用图形的数据数组缓冲区  
    cube = new TextureCube(); 

 // Constructor with global application context
 public MyGLRenderer(Context context) {
  this.context = context;
  
  // 设置所用图形的数据数组缓冲区
  cube = new TextureCube();
 }
其中,TextureCube 为我们自己的纹理类,需要自己实现,后面会有实现。context和cube分别为成员变量:

[java]
private Context context;    // 应用的上下文句柄  
 
private TextureCube  cube; 

 private Context context; // 应用的上下文句柄
 
 private TextureCube  cube;

②重载函数onSu易做图ceCreated,创建绚烂器时需要初始化的部分皆在此:

[java]
// Call back when the su易做图ce is first created or re-created  
    @Override 
    public void onSu易做图ceCreated(GL10 gl, EGLConfig config) 
    { 
        // 启用阴影平滑  
        gl.glShadeModel(GL10.GL_SMOOTH); 
         
        // 设置背景颜色  
        gl.glClearColor(0.2f, 0.4f, 0.52f, 1.0f); 
         
        // 设置深度缓存  
        gl.glClearDepthf(1.0f); 
         
        // 启用深度测试  
        gl.glEnable(GL10.GL_DEPTH_TEST); 
         
        // 所作深度测试的类型  
        gl.glDepthFunc(GL10.GL_LEQUAL); 
         
        // 告诉系统对透视进行修正  
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 
         
        // 禁止抖动以取得更好的性能  
        gl.glDisable(GL10.GL_DITHER); 
         
        // 设置纹理  
        cube.loadTexture(gl, context);      // 加载纹理  
        gl.glEnable(GL10.GL_TEXTURE_2D);    // 纹理使能  
    } 

// Call back when the su易做图ce is first created or re-created
 @Override
 public void onSu易做图ceCreated(GL10 gl, EGLConfig config)
 {
  // 启用阴影平滑
  gl.glShadeModel(GL10.GL_SMOOTH);
  
  // 设置背景颜色
  gl.glClearColor(0.2f, 0.4f, 0.52f, 1.0f);
  
  // 设置深度缓存
  gl.glClearDepthf(1.0f);
  
  // 启用深度测试
  gl.glEnable(GL10.GL_DEPTH_TEST);
  
  // 所作深度测试的类型
  gl.glDepthFunc(GL10.GL_LEQUAL);
  
  // 告诉系统对透视进行修正
  gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
  
  // 禁止抖动以取得更好的性能
  gl.glDisable(GL10.GL_DITHER);
  
  // 设置纹理
  cube.loadTexture(gl, context);  // 加载纹理
  gl.glEnable(GL10.GL_TEXTURE_2D); // 纹理使能
 }
以上一些功能的打开和声明,都可以在我博客之前的一些文章中找到,不在详述。

最重要的一句就是  cube.loadTexture(gl, context); 加载纹理。

③重载函数onSu易做图ceChanged,当屏幕旋转(横屏变为竖屏)时,调用。当然,在初始化的时候也是要调用的:

[java]
// Call back after onSu易做图ceCreated() or whenever the window's size changes  
@Override 
public void onSu易做图ceChanged(GL10 gl, int width, int height) 

    if(height == 0) // 防止被零除  
    { 
        height = 1;  
    } 
     
    // 重置当前的视图区域  
    gl.glViewport(0, 0, width, height); 
     
    // 选择投影矩阵  
    gl.glMatrixMode(GL10.GL_PROJECTION); 
     
    // 重置投影矩阵  
    gl.glLoadIdentity(); 
     
    // 设置视图区域的大小  
    GLU.gluPerspective(gl, 45.0f, (float)width/(float)height,0.1f,100.0f); 
     
    // 选择模型观察矩阵  
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
     
    // 重置模型观察矩阵  
    gl.glLoadIdentity(); 

 // Call back after onSu易做图ceCreated() or whenever the window's size changes
 @Override
 public void onSu易做图ceChanged(GL10 gl, int width, int height)
 {
  if(height == 0) // 防

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,