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

[Android开发学习15]Android OpenGL ES 纹理映射之glDrawArrays

目标: 为四方体的每个面贴上一张图片,并自动旋转。

 

一、基础知识:


1.初始化:

 // 1.允许2D贴图,纹理
 gl.glEnable(GL10.GL_TEXTURE_2D);
 // 2.创建纹理
 gl.glGenTextures(1, textureids, 0);
 // 3.绑定要使用的纹理
 gl.glBindTexture(GL10.GL_TEXTURE_2D, textureids[0]);
 // 4.生成纹理
 GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GLImage.iBitmap, 0);
 // 5.线性滤波
 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);


2.使用:

 // 1.清除屏幕和深度缓存
 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
 // 2.重置当前的模型观察矩阵
 gl.glLoadIdentity();
 // 3.开启顶点和纹理功能(开启顶点和纹理缓冲)
 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
 gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
 // 4.设置点点和纹理
 gl.glVertexPointer(3, GL10.GL_FIXED, 0, vertexBuffer);
 gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, texBuffer);
 // 5.向z轴里移入6.0f
 gl.glTranslatef(0.0f, 0.0f, -5.0f);
 // 6.设置3个方向的旋转
 gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);
 gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);
 gl.glRotatef(zrot, 0.0f, 0.0f, 1.0f);
 // 7.绘制正方体
 for (int i = 0; i < 6; i++) {
  switch(i)
  {
         case 0:
             // 8.生成纹理
             GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GLImage.iBitmap, 0);
             break;
         }         
            gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, i * 4, 4);
 }

 // 9.关闭顶点和纹理功能
 gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    
 // 10.调节旋转角度
 xrot+=0.5f;
 yrot+=0.4f;
 zrot+=0.6f;


 

3.补充说明,相对上一节中,我多添加了一个函数:

[java]
public GLRender(Context context) { 
        this.context = context; 
        // 初始化  
        textureids = new int[1]; 
 
        ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); 
        vbb.order(ByteOrder.nativeOrder()); 
        vertexBuffer = vbb.asIntBuffer(); 
        vertexBuffer.put(vertices); 
        vertexBuffer.position(0); 
 
        ByteBuffer tbb = ByteBuffer.allocateDirect(texCoords.length * 4 * 6); 
        tbb.order(ByteOrder.nativeOrder()); 
        texBuffer = tbb.asIntBuffer(); 
        //为每一个面贴上纹理  
        for (int i = 0; i < 6; i++) { 
            texBuffer.put(texCoords); 
        } 
        texBuffer.position(0); 
    } 

public GLRender(Context context) {
        this.context = context;
        // 初始化
        textureids = new int[1];

        ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
        vbb.order(ByteOrder.nativeOrder());
        vertexBuffer = vbb.asIntBuffer();
        vertexBuffer.put(vertices);
        vertexBuffer.position(0);

        ByteBuffer tbb = ByteBuffer.allocateDirect(texCoords.length * 4 * 6);
        tbb.order(ByteOrder.nativeOrder());
        texBuffer = tbb.asIntBuffer();
        //为每一个面贴上纹理
        for (int i = 0; i < 6; i++) {
            texBuffer.put(texCoords);
        }
        texBuffer.position(0);
    }
主要是对各个面的顶点做一个初始化。


 

 

 

二、实现:

1. 界面编辑:
【res\layout\main.xml】

[html]
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<TextView   
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:text="@string/hello" 
    /> 
 
<Button 
    android:id="@+id/button1" 
    android:layout_width="145dp" 
    android:layout_height="wrap_content" 
    android:text="演示开始" /> 
 
</LinearLayout> 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />

<Button
    android:id="@+id/button1"
    android:layout_width="145dp"
    android:layout_height="wrap_content"
    android:text="演示开始" />

</LinearLayout>

2.代码编辑:
【\src\com\yarin\android\Examples\Activity01.java】

[java]
package com.yarin.android.Examples_12_05; 
 
import java.io.IOException; 
import java.io.InputStream

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,