openGL es实现小实例

在模拟器中要做一个彩色的三角形和正方形,代码里面我写了一些注解,新学opengl,不正确的地方望指正!

1、SqureOpenGlActivity类为Activity类

import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.WindowManager;

public class SqureOpenGlActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        
        MyRenderer glRender = new MyRenderer();
        GLSurfaceView gView = new GLSurfaceView(this);
        
        gView.setRenderer(glRender);
        setContentView(gView);
    }
}
2、渲染类MyRenderer

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 {
	
	static int one = 0x10000;//int one =1
	
	//缓冲区:三角形、正方形、三角形颜色、正方形颜色
	private static IntBuffer trangelBuffer;
	private static IntBuffer squreBuffer;
	private static IntBuffer mTraColorBuffer;
	private static IntBuffer mSquColorbBuffer;
	
	//三角形顶点
	private int[] vertices = new int[]{
			0,one,0,
			-one,-one,0,
			one,-one,0
	};
 
	//正方形坐标
	private int[] squres = new int[] {
		one,one,0,
		-one,one,0,
		one,-one,0,
		-one,-one,0
	};
	//三角形各个顶点的颜色
	private int[] colorTra = new int[]{
			one,0,0,one,
			0,one,0,one,
			0,0,one,one
	};
	//正方形各个顶点的颜色
	private int[] colorSqu = new int[] {
			one,0,0,0,
			one,one,0,0,
			one,one,one,0,
			0,one,one,0
	};
	
	@Override
	public void onDrawFrame(GL10 gl) {
		// 准备缓冲区
		//trangle
		ByteBuffer vbb1 = ByteBuffer.allocateDirect(vertices.length * 4);
		vbb1.order(ByteOrder.nativeOrder());
		trangelBuffer = vbb1.asIntBuffer();
		trangelBuffer.put(vertices);
		trangelBuffer.position(0);
		
		//squre
		ByteBuffer vbb2 = ByteBuffer.allocateDirect(squres.length * 4);
		vbb2.order(ByteOrder.nativeOrder());
		squreBuffer = vbb2.asIntBuffer();
		squreBuffer.put(squres);
		squreBuffer.position(0);
		
		//trangle color
		ByteBuffer color1 = ByteBuffer.allocateDirect(colorTra.length * 4);
		color1.order(ByteOrder.nativeOrder());
		mTraColorBuffer = color1.asIntBuffer();
		mTraColorBuffer.put(colorTra);
		mTraColorBuffer.position(0);
		
		//squre color
		ByteBuffer color2 = ByteBuffer.allocateDirect(colorSqu.length * 4);
		color2.order(ByteOrder.nativeOrder());
		mSquColorbBuffer = color2.asIntBuffer();
		mSquColorbBuffer.put(colorSqu);
		mSquColorbBuffer.position(0);
		
		//开始绘制三角形
		gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
		gl.glLoadIdentity();
		//允许顶点和颜色缓冲
		gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
		gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
		
		//三角形处理
		gl.glTranslatef(-1.5f, 0.0f, -6.0f);
		gl.glVertexPointer(3, GL10.GL_FIXED, 0, trangelBuffer);
		gl.glColorPointer(4, GL10.GL_FIXED, 0, mTraColorBuffer);
		gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
		gl.glLoadIdentity();
		
		//正方形处理
		gl.glTranslatef(1.5f, 0.0f, -6.0f);
		gl.glVertexPointer(3, GL10.GL_FIXED, 0, squreBuffer);
		gl.glColorPointer(4, GL10.GL_FIXED, 0, mSquColorbBuffer);
		gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
		
		//取消缓冲
		gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
		gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
		
	}

	@Override
	public void onSurfaceChanged(GL10 gl, int width, int height) {
		float ratio = (float) width / height;
		// 窗体变化时调用
		//场景大小
		gl.glViewport(0, 0, width, height);
		
		//投影矩阵
		gl.glMatrixMode(GL10.GL_PROJECTION);
		gl.glLoadIdentity();
		//设置视图的大小
		gl.glFrustumf( -ratio, ratio, -1, 1, 1f, 10);
		//选择观察矩阵模型
		gl.glMatrixMode(GL10.GL_MODELVIEW);
		gl.glLoadIdentity();
	}

	@Override
	public void onSurfaceCreated(GL10 gl, EGLConfig config) {
		
		// 关闭图形抖动,否则灯光照射后没有光斑效果
		gl.glDisable(GL10.GL_DITHER);
		//透视效果
		gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
		//启用平滑阴影
		gl.glShadeModel(GL10.GL_SMOOTH);
		//设置深度缓存
		gl.glClearDepthf(1.0f);
		//启用深度缓存
		gl.glEnable(GL10.GL_DEPTH_TEST);
		//设置深度测试的类型
		gl.glDepthFunc(GL10.GL_LEQUAL);
		
		
//		gl.glLoadIdentity();
		//清屏为黑色
		gl.glClearColor(0, 0, 0, 0);
	}

}

3、运行效果如下:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值