您的位置:首页 > 移动开发 > Android开发

[Android]OpenGL绘制2D几何图形

2013-08-24 21:15 405 查看
自定义一个活动页面继承GLSurfaceView

import android.content.Context;
import android.opengl.GLSurfaceView;

public class DemoGLSurfaceView extends GLSurfaceView {

public DemoGLSurfaceView(Context context) {
super(context);
DemoGLRenderer renderer = new DemoGLRenderer();
setRenderer(renderer);
}

}


自定义一个renderer继承Renderer

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.opengl.GLSurfaceView.Renderer;

public class DemoGLRenderer implements Renderer {

private float[] triangleData = new float[] {
0.1f, 0.6f , 0.0f , // 上顶点
-0.3f, 0.0f , 0.0f , // 左顶点
0.3f, 0.1f , 0.0f  // 右顶点
};

private FloatBuffer triangleDataBuffer;

private float[] recData = new float[] {
0.4f, 0.4f , 0.0f, // 右上顶点
0.4f, -0.4f , 0.0f, // 右下顶点
-0.4f, 0.4f , 0.0f, // 左上顶点
-0.4f, -0.4f , 0.0f // 左下顶点
};

private FloatBuffer recDataBuffer;

private float[] pentacle = new float[]{
0.4f , 0.4f , 0.0f,
-0.2f , 0.3f , 0.0f,
0.5f , 0.0f , 0f,
-0.4f , 0.0f , 0f,
-0.1f, -0.3f , 0f
};

private FloatBuffer pentacleDataBuffer;

public DemoGLRenderer() {
ByteBuffer byteBuf = ByteBuffer.allocateDirect(triangleData.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
triangleDataBuffer = byteBuf.asFloatBuffer();
triangleDataBuffer.put(triangleData);
triangleDataBuffer.position(0);

byteBuf = ByteBuffer.allocateDirect(recData.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
recDataBuffer = byteBuf.asFloatBuffer();
recDataBuffer.put(recData);
recDataBuffer.position(0);

byteBuf = ByteBuffer.allocateDirect(pentacle.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
pentacleDataBuffer = byteBuf.asFloatBuffer();
pentacleDataBuffer.put(pentacle);
pentacleDataBuffer.position(0);
}

@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.glEnableClientState(GL10.GL_COLOR_ARRAY);
// 设置当前矩阵堆栈为模型堆栈,
gl.glMatrixMode(GL10.GL_MODELVIEW);

// 重置当前的模型视图矩阵
gl.glLoadIdentity();
gl.glTranslatef(-0.32f, 0.35f, -1f);
// 设置顶点的位置数据
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleDataBuffer);
// 根据顶点数据绘制平面图形
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

// 重置当前的模型视图矩阵
gl.glLoadIdentity();
gl.glTranslatef(0.6f, 0.8f, -1.5f);
// 设置顶点的位置数据
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, recDataBuffer);
// 根据顶点数据绘制平面图形
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

// 重置当前的模型视图矩阵
gl.glLoadIdentity();
gl.glTranslatef(0.4f, -0.5f, -1.5f);
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
// 设置顶点的位置数据
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, pentacleDataBuffer);
// 根据顶点数据绘制平面图形
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 5);

gl.glFinish();
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// 设置3D视窗的大小及位置
gl.glViewport(0, 0, width, height);
// 将当前矩阵模式设为投影矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
// 初始化单位矩阵
gl.glLoadIdentity();
// 计算透视视窗的宽度、高度比
float ratio = (float) width / height;
// 调用此方法设置透视视窗的空间大小。
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// 关闭抗抖动
gl.glDisable(GL10.GL_DITHER);
// 设置系统对透视进行修正
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
gl.glClearColor(0, 0, 0, 0);
// 设置阴影平滑模式
gl.glShadeModel(GL10.GL_SMOOTH);
// 启用深度测试
gl.glEnable(GL10.GL_DEPTH_TEST);
// 设置深度测试的类型
gl.glDepthFunc(GL10.GL_LEQUAL);
}

}


主页面代码

import com.wisher.opengl.surfaceview.DemoGLSurfaceView;

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

public class DemoActivity01 extends Activity {

private DemoGLSurfaceView view;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

view = new DemoGLSurfaceView(this);
setContentView(view);
}
}


程序运行效果图



文章部分代码源自李刚《疯狂android讲义》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: