现在的位置: 首页 > 综合 > 正文

android opengl es绘制三角形+纹理

2013年02月05日 ⁄ 综合 ⁄ 共 3102字 ⁄ 字号 评论关闭

package com.andy.test;


import android.app.Activity;
import android.os.Bundle;

public class TestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MySurfaceView(this));
    }
}

/**
 * @author andy.xie <andy_xiexh@163.com>
 * @date 2012-7-19
 * @filename MySurfaceView.java
 */

package com.andy.test;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLSurfaceView;
import android.opengl.GLUtils;

public class MySurfaceView extends GLSurfaceView{

	public MySurfaceView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		
		setRenderer(new MyRenderer());
	}

	private class MyRenderer implements Renderer {

		float vertices[]=new float[] {
        		-1, -1,
            	1, -1,
            	0, 1
        };
		
		float textureCoors[]=new float[] {
        		0, 1,
            	1,1,
            	0.5f,0,
	    };  
		
		FloatBuffer mVertexBuffer, mTexCoordBuffer;
		int mTexId;
		
		public MyRenderer() {
			// TODO Auto-generated constructor stub
			ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
	        vbb.order(ByteOrder.nativeOrder());//设置字节顺序
	        mVertexBuffer = vbb.asFloatBuffer();//转换为int型缓冲
	        mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据
	        mVertexBuffer.position(0);//设置缓冲区起始位置
	        
	        ByteBuffer cbb = ByteBuffer.allocateDirect(textureCoors.length*4);
	        cbb.order(ByteOrder.nativeOrder());//设置字节顺序
	        mTexCoordBuffer = cbb.asFloatBuffer();//转换为int型缓冲
	        mTexCoordBuffer.put(textureCoors);//向缓冲区中放入顶点着色数据
	        mTexCoordBuffer.position(0);//设置缓冲区起始位置
	        
	        
		}

		private int initTexture(GL10 gl, Bitmap bitmap) {
			// TODO Auto-generated method stub
			int[] textures = new int[1];
			
			gl.glEnable(GL10.GL_TEXTURE_2D);
			gl.glGenTextures(1, textures, 0);    
			int currTextureId = textures[0];
			
			gl.glBindTexture(GL10.GL_TEXTURE_2D, currTextureId);
			gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST);
	        gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR);
	        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,GL10.GL_REPEAT);
	        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,GL10.GL_REPEAT);
	        
	        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
			return currTextureId;
		}

		@Override
		public void onDrawFrame(GL10 gl) {
			// TODO Auto-generated method stub
			gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
	        gl.glVertexPointer
	        (
	        		2,				
	        		GL10.GL_FLOAT,	
	        		0, 				
	        		mVertexBuffer
	        );
	        
	        gl.glEnable(GL10.GL_TEXTURE_2D);   
	        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
	        gl.glTexCoordPointer
	        (
	        		2, 					//每个顶点两个纹理坐标数据 S、T
	        		GL10.GL_FLOAT, 		//数据类型
	        		0, 					//连续纹理坐标数据之间的间隔
	        		mTexCoordBuffer		//纹理坐标数据
	        );
	        gl.glBindTexture(GL10.GL_TEXTURE_2D, mTexId);   
	        
	        gl.glDrawArrays
	        (
	        		GL10.GL_TRIANGLES, 
	        		0, 
	        		3
	        );
	        gl.glDisable(GL10.GL_TEXTURE_2D);//关闭纹理
		}

		@Override
		public void onSurfaceChanged(GL10 gl, int width, int height) {
			// TODO Auto-generated method stub
			gl.glViewport(0, 0, width, height);
        	//设置当前矩阵为投影矩阵
            gl.glMatrixMode(GL10.GL_PROJECTION);
            //设置当前矩阵为单位矩阵
            gl.glLoadIdentity();
		}

		@Override
		public void onSurfaceCreated(GL10 gl, EGLConfig config) {
			// TODO Auto-generated method stub
			Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
			
			mTexId = initTexture(gl, bitmap);
		}
		
	}
}

抱歉!评论已关闭.