[Android]OpenGL绘制2D几何图形
2013-08-24 21:15
405 查看
自定义一个活动页面继承GLSurfaceView
自定义一个renderer继承Renderer
主页面代码
程序运行效果图
文章部分代码源自李刚《疯狂android讲义》
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讲义》
相关文章推荐
- Android学习日记(yzy):opengl 绘制2d图形 基本框架
- Android开发之OpenGL绘制2D图形的方法分析
- 关于openGL, openGL ES, openVG及android中2D调用关系的报告
- Android OpenGL ES和OpenGL一起学(一)------绘制一个简单的矩形
- 关于openGL, openGL ES, openVG及android中2D调用关系的报告
- Android游戏开发---2D游戏中背景的绘制
- Android 2D Graphics的绘制
- (4.1.36.3)android Graphics(一):概述及基本几何图形绘制
- Android OpenGL 纹理绘制图像---Native实现
- 基于Android的OpenGL—在 GLSurfaceView上绘制三角形和使用投影和相机视图
- Android游戏开发---2D游戏中背景的绘制
- Android 自定义控件之基础几何图形绘制详解
- Android 中使用OpenGL ES进行2D开发(绘制第一个三角形)
- android Graphics(一):概述及基本几何图形绘制
- Android 2D图形绘制 汇总
- 绘制几何图形:使用android.graphics类
- Android OpenGL10 基本图形绘制 <3>
- Android移动开发-使用OpenGL来绘制3D纹理图的实现
- Android OpenGL 纹理绘制图像---总结
- [OpenGL]从零开始写一个Android平台下的全景视频播放器——3.2 使用OpenGL ES 2.0绘制一个球