openGL 简单demo

画一个三角形一个正方形


建立渲染器类

package com.example.demo_opengl;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;

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

import android.opengl.GLSurfaceView.Renderer;

public class MyRenderer implements Renderer {
	int one = 0x10000; // 一定要16进制,16
	int one1 = 0x10000 / 2; // 一定要16进制,16

	private IntBuffer triangleBuffer; // 缓冲三角形
	private int[] triangleVertices = new int[] { 0, one, 0, -one, -one, 0, one,
			-one, 0 }; // 三角形的三个顶点,上,左下,右下

	// 正方形
	private IntBuffer quaterBuffer;
	private int[] quaterVertices = new int[] { one, one, 0, -one, one, 0, one,
			-one, 0, -one, -one, 0 }; // 四边形,右上,左上,右下,左下
	// 正方形2
	private IntBuffer quaterBuffer2;
	private int[] quaterVertices2 = new int[] { one1, one1, 10, -one1, one1,
			10, one1, -one1, 10, -one1, -one1, 10 }; // 四边形,右上,左上,右下,左下

	@Override
	public void onSurfaceCreated(GL10 gl, EGLConfig config) {
		// 初始化三角形
		// ByteBuffer位于java.nio包中,目前提供了Java基本类型中除Boolean外其他类型的缓冲类型,比如ByteBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer和ShortBuffer
		// 。一个int类占4字节所以要*4
		ByteBuffer byteBuffer = ByteBuffer
				.allocateDirect(triangleVertices.length * 4); // 为缓冲区分配空间
		byteBuffer.order(ByteOrder.nativeOrder());

		triangleBuffer = byteBuffer.asIntBuffer();
		triangleBuffer.put(triangleVertices); // 顶点坐标放入intbuffer
		triangleBuffer.position(0); // 缓冲区指针指向第一个字节位置

		// 画正方形----------------------------------------------
		byteBuffer = ByteBuffer.allocateDirect(quaterVertices.length * 4);
		byteBuffer.order(ByteOrder.nativeOrder());
		quaterBuffer = byteBuffer.asIntBuffer();
		quaterBuffer.put(quaterVertices);
		quaterBuffer.position(0);
		// 画正方形2----------------------------------------------
		byteBuffer = ByteBuffer.allocateDirect(quaterVertices2.length * 4);
		byteBuffer.order(ByteOrder.nativeOrder());
		quaterBuffer2 = byteBuffer.asIntBuffer();
		quaterBuffer2.put(quaterVertices2);
		quaterBuffer2.position(0);
	}

	@Override
	public void onSurfaceChanged(GL10 gl, int width, int height) {
		// 改变时
		float ratio = (float) width / height;
		// OpenGL场景大小
		gl.glViewport(0, 0, width, height);
		// 投影矩阵
		gl.glMatrixMode(GL10.GL_PROJECTION);
		// 重置投影矩阵
		gl.glLoadIdentity();
		// x,y,z轴可以设置的最远距离
		gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
		// 选择模型观察矩阵
		gl.glMatrixMode(GL10.GL_MODELVIEW);
		// 重置模型观察矩阵
		gl.glLoadIdentity();
	}

	@Override
	public void onDrawFrame(GL10 gl) {
		// 画三角形**************************

		gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

		gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // 设置这个顶点

		gl.glLoadIdentity();

		gl.glTranslatef(1.5f, 0.0f, -6.0f); // 右移1.5,移入屏幕6

		gl.glVertexPointer(3, GL10.GL_FIXED, 0, triangleBuffer); // 设置三角形顶点坐标(维度,顶点类型,步长,缓存)

		gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); // 绘制三角形

		
		// 画正方形1********************************
//		gl.glLoadIdentity();
//		gl.glTranslatef(-1.0f, 0.0f, -6.0f); // 左移2,移入屏幕6
//
//		gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);
//
//		gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); // GL_TRIANGLE_STRIP规则绘制四边形
//		 gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4); //GL_TRIANGLE_FAN规则绘制四边形
		// 画正方形2********************************
		gl.glLoadIdentity();//刷新,重置观察矩阵
		gl.glTranslatef(-4.0f, 0.0f, -6.0f); // 左移4.0,移入屏幕6

		gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer2);

		gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); // GL_TRIANGLE_STRIP规则绘制四边形
		// gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4); //GL_TRIANGLE_FAN规则绘制四边形

		gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); // 关闭顶点设置
	}

}



在主函数中调用

1.新建GLSurfaceView

2.新建渲染器类MyRenderer()

3.view加载渲染器并显示


package com.example.demo_opengl;

import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.support.v4.app.NavUtils;

public class MainActivity extends Activity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 新建GLSurfaceView类,渲染器类,载入GLSurfaceView类
		GLSurfaceView glSurfaceView = new GLSurfaceView(this);
		Renderer myRenderer = new MyRenderer();
		glSurfaceView.setRenderer(myRenderer);
		setContentView(glSurfaceView);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

}





你可能感兴趣的:(android)