`
guozhenqian
  • 浏览: 151002 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android OpenGL es 绘图示例

 
阅读更多

开始学OpenGL了,想找个例子,不过弄了好久不行,绘出来的都是黑屏一块,好不容易找到一个可用的例子

对原作者表示感谢http://blog.csdn.net/simdanfeg/article/details/6255112

直接上例子吧

Activity很简单,创建一个GLSurfaceView,然后set一个renderer对象

 

public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		// 创建一个GLSurfaceView,用于显示OpenGL绘制的图形
		GLSurfaceView glView = new GLSurfaceView(this);
		// 创建GLSurfaceView的内容绘制器
		MyRenderer myRender = new MyRenderer();
		// 为GLSurfaceView设置绘制器
		glView.setRenderer(myRender);
		setContentView(glView);
	}

 接下来自己要写一个类,实现Renderer接口,接口中的方法就不再介绍了,到处都有介绍,下边是Renderer类的代码

package org.crazyit.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.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.opengl.GLSurfaceView.Renderer;
import android.os.Build;

@TargetApi(Build.VERSION_CODES.CUPCAKE)
public class MyRenderer implements Renderer {
    // 关于0x10000注明:Thus 0x10000 means a hexadecimal memory address 10000
    // 就像cai_huan25大哥说的,大家把它理解为google画图单位就ok 
    static int one = 0x10000;
    // Int型的缓冲区,下面定义了四个分别是三角形,正方形,三角形颜色,正方形颜色的缓冲区 
    private static IntBuffer triangleBuffer;
    private static IntBuffer quaterBuffer;
    private static IntBuffer color1Buffer;
    private static IntBuffer color2Buffer;
    // 三角形顶点,分别对应x,y,z,因此程序为二维,所以z轴上皆为0
    private int[] vertices = new int[] { 
            0, one, 0,
            -one, -one, 0,
            one, -one, 0 
    };
    //以正方形为例,说明坐标轴:坐标中心位于正方形中心,下面四个顶点分别是右上角,左上角,右下角,左下角 
    private int[] quater = new int[] { 
            one, one, 0,
            -one, one, 0,
            one, -one, 0,
            -one, -one, 0 
    };
    //定义每个顶点的颜色,每个顶点的颜色皆由(r,g,b,a)
    //三角形各顶点颜色(三个顶点)
    private int[] color = new int[] { 
            one, 0, 0,one,
            0, one,0, one,
            0,0,one, one 
    };
    //正方形各顶点颜色(4个顶点)
    private int[] color2 = new int[] { 
            one, 0, 0, 0,
            one, one, 0, 0,
            one,one,one, 0,
            0, one, one, 0 
    };

    //实现Renderer接口的方法onDrawFrame
    @TargetApi(Build.VERSION_CODES.CUPCAKE)
	@SuppressLint("NewApi")
	@Override
    public void onDrawFrame(GL10 gl) {
        //因为在glVertexPointer或者是glColorPointer方法中要求传入一个直接的Buffer,
        //所以下面的vbb1,vbb2,colorvbb1,colorvbb2皆为创建一个直接的Buffer
        //以第一个为例说明,首先用ByteBuffer的allocateDirect方法来分配新的直接字节缓冲区。
        //因1个Int有4个byte,所以将vertices的长度乘以4
        // order(ByteOrder.nativeOrder)方法以本机字节顺序来修改此缓冲区的字节顺序
        //然后用asIntBuffer方法创建此字节缓冲区的视图,作为 int 缓冲区。
        //put方法将给定 int 写入此缓冲区的当前位置,然后该位置递增。 
        //position方法设置此缓冲区的位置。如果标记已定义并且大于新的位置,则要丢弃该标记。 
        
        // triangle的ByteBuffer
        ByteBuffer vbb1 = ByteBuffer.allocateDirect(vertices.length * 4);
        vbb1.order(ByteOrder.nativeOrder());
        triangleBuffer = vbb1.asIntBuffer();
        triangleBuffer.put(vertices);
        triangleBuffer.position(0);

        // quater的ByteBuffer
        ByteBuffer vbb2 = ByteBuffer.allocateDirect(quater.length * 4);
        vbb2.order(ByteOrder.nativeOrder());
        quaterBuffer = vbb2.asIntBuffer();
        quaterBuffer.put(quater);
        quaterBuffer.position(0);

        // color的ByteBuffer
        ByteBuffer colorvbb1 = ByteBuffer.allocateDirect(color.length * 4);
        colorvbb1.order(ByteOrder.nativeOrder());
        color1Buffer = colorvbb1.asIntBuffer();
        color1Buffer.put(color);
        color1Buffer.position(0);

        // color2的ByteBuffer
        ByteBuffer colorvbb2 = ByteBuffer.allocateDirect(color2.length * 4);
        colorvbb2.order(ByteOrder.nativeOrder());
        color2Buffer = colorvbb2.asIntBuffer();
        color2Buffer.put(color2);
        color2Buffer.position(0);

        // 绘制Triangles
        // 清除屏幕和深度缓存
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        // 重置当前的模型观察矩阵
        gl.glLoadIdentity();

        //以下两步为绘制颜色与顶点前必做操作
        //(颜色可采用另一种简单方式,说见http://blog.csdn.net/Simdanfeg/archive/2011/03/17/6255932.aspx)
        // 允许设置顶点
        //GL10.GL_VERTEX_ARRAY顶点数组
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        // 允许设置颜色
        //GL10.GL_COLOR_ARRAY颜色数组
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

        // 左移1.5单位,并移入屏幕6.0
        gl.glTranslatef(-1.5f, 0.0f, -6.0f);

        //GL_FIXED,GL_FLOAT,GL_UNSIGNED_BYTE
        //更多信息见  http://www.devx.com/wireless/Article/32879/1954
        //参数中的GL_FIXED表示我们之前定义的one为单位长度 
        // 设置三角形
        gl.glVertexPointer(3, GL10.GL_FIXED, 0, triangleBuffer);
        // 设置三角形颜色
        gl.glColorPointer(4, GL10.GL_FIXED, 0, color1Buffer);
        // 绘制三角形
        //GL10.GL_TRIANGLES:把每三个顶点作为一个独立的三角形。顶点3n-2,3n-1和3n定义了第n个三角形,总共绘制N/3个三角形。 
        gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

        // 重置当前模型的观察矩阵
        gl.glLoadIdentity();

        // 左移1.5单位,并移入屏幕6.0
        gl.glTranslatef(1.5f, 0.0f, -6.0f);
        // 设置正方形
        gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);
        // 设置正方形颜色
        gl.glColorPointer(4, GL10.GL_FIXED, 0, color2Buffer);
        //GL_TRIANGLE_STRIP:绘制一组相连的三角形。对于奇数点n,顶点n,n+1和n+2定义了第n个三角形;
        //对于偶数n,顶点n+1,n和n+2定义了第n个三角形,总共绘制N-2个三角形。 
        // 绘制正方形
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

        // 取消颜色设置
        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
        // 取消顶点设置
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

    }

    //实现Renderer接口的方法onSurfaceChanged
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        float ratio = (float) width / height;
        // 设置OpenGL场景的大小,(0,0)表示窗口内部视口的左下角,(w,h)指定了视口的大小 
        gl.glViewport(0, 0, width, height);
        // 设置投影矩阵
        gl.glMatrixMode(GL10.GL_PROJECTION);
        // 重置投影矩阵
        gl.glLoadIdentity();
        // 设置视口的大小
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
        //以下两句告诉opengl es,以后所有的变换都将影响这个模型(即我们绘制的图形)
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    //实现Renderer接口的方法onSurfaceCreated
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {

        
        // 告诉系统对透视进行修正(选择效率优先还是速度优先,这里我们选择速度优先)
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
        // 用黑色来清除屏幕颜色
        gl.glClearColor(0, 0, 0, 0);
        // 启用阴影平滑
        gl.glShadeModel(GL10.GL_SMOOTH);

        // 设置深度缓存
        gl.glClearDepthf(1.0f);
        // 启用深度测试
        gl.glEnable(GL10.GL_DEPTH_TEST);
        // 所做深度测试的类型
        gl.glDepthFunc(GL10.GL_LEQUAL);

    }
}

 程序的运行结果是一个是三角形和正方形

 

 

  • 大小: 6.4 KB
分享到:
评论

相关推荐

    Android OpenGl ES绘制圆点与优化圆点锯齿

    首先,我们要理解OpenGL ES的基本绘图单位是像素,而点是最基本的形状。在OpenGL ES中,我们使用`glDrawArrays`或`glDrawElements`函数来绘制几何形状,包括点。每个点由两个坐标(x, y)定义,通常是浮点数。为了在...

    Android Opengles 开发入门技术文档

    开发者可以通过示例代码来熟悉OpenGL ES 的各种功能。例如,使用onDrawFrame()方法进行绘图,onSurfaceCreated()用于初始化资源,onSurfaceChanged()处理视口尺寸变化。同时,可以尝试创建纹理、绘制3D几何体、应用...

    Android OpenGL入门示例:绘制三角形和正方形

    通常,这可以通过在build.gradle文件中引入`implementation 'androidx.opengles:opengl-es-utils:1.0.0'`来完成。确保你的项目支持JNI(Java Native Interface),因为OpenGL ES是C/C++接口,需要通过JNI桥接。 接...

    Android OpenGL的一个简单的例子.zip

    这个"Android OpenGL的一个简单的例子.zip"文件包含了一个基本的Android OpenGL应用实例,帮助开发者了解如何在Android设备上使用OpenGL ES。 首先,我们需要了解OpenGL ES的基本概念。OpenGL ES是OpenGL的精简版,...

    android opengl es 2.0官方demo

    OpenGL ES(OpenGL for Embedded Systems)是OpenGL的一个精简版本,专为嵌入式设备...通过分析和学习这些官方示例,开发者能够掌握如何在Android平台上有效地利用OpenGL ES 2.0进行图形编程,创建出高性能的图形应用。

    OpenGLES demo - 3. 建立Android工程

    【OpenGLES demo - 3. 建立Android工程】是关于在Android平台上构建一个使用OpenGL ES(OpenGL for Embedded Systems)的示例项目。OpenGL ES是针对嵌入式设备,如智能手机和平板电脑,设计的一个2D和3D图形处理库。...

    android opengl 入门 画点 画图

    在Android中,我们通常通过`GLSurfaceView`来创建一个OpenGL ES的绘图表面。`GLSurfaceView`是一个专门用于OpenGL ES的视图组件,它管理了一个线程来处理OpenGL ES的渲染,并提供了回调机制,如`onSurfaceCreated()`...

    android_opengl.rar_Android opengl_android_opengl例子

    在Android平台上,OpenGL ES(Embedded Systems的缩写)被广泛使用,它是OpenGL的一个精简版本,专为嵌入式设备如智能手机和平板电脑设计。Android OpenGL ES提供了丰富的接口,让开发者能够创建复杂的图形应用程序...

    nehe_opengl_chm.zip_android opengles c_nehe c++_nehe opengl c_ne

    压缩包中的标签提到了“android_opengles”,意味着教程可能也包含了如何在Android平台上使用OpenGLES的知识。 6. **源代码分析**:每个教程通常都附带了完整的源代码,这对于初学者学习和理解OpenGL的实现非常有...

    android OPenGL基础范例一

    在“android OpenGL基础范例一”中,我们看到的是一个入门级别的示例,主要目标是展示如何使用OpenGL ES来创建和显示基本的几何图形,以及如何将文本与图形结合起来。这个例子中,开发者通常会通过以下步骤来实现: ...

    Android OpenGL和Demo以及源代码

    1. **上下文(Context)**:OpenGL ES的操作环境,用于存储状态、缓存和绘图信息。在Android中,每个GLSurfaceView组件都有一个与之关联的OpenGL ES上下文。 2. **顶点(Vertices)**:构成几何形状的基本元素,...

    OpenGL_ES 实例源代码

    在"OpenGL_ES_Programming_Guide源代码"中,读者可以找到与书中示例对应的实现,通过实际操作加深对理论的理解。这些示例可能包括创建基本几何体、纹理映射、变换和简单的光照效果等。 对于标签中的"VC",这可能指...

    opengles 2.0教程

    - 实例代码:`opengles_sample`可能包含了一些实际的示例代码,通过分析和运行这些代码,可以加深对OpenGL ES 2.0的理解。 - 在线教程:网上有许多教程和指南,如LearnOpenGLES.com、OpenGL-Tutorial.org等,它们...

    android-openGL-canvas-master.zip

    在“android-openGL-canvas-master.zip”这个项目中,开发者可能结合了这两者,创建了一个示例应用来展示如何在 Android 上使用 OpenGL ES(OpenGL 的嵌入式版本)与 Canvas 进行交互,以实现更高效的图形绘制和动画...

    OpenGL ES 学习demo

    在这个“OpenGL ES 学习demo”中,我们可以看到一系列的示例代码和项目,用于帮助初学者理解并实践基本的OpenGL ES绘图操作。 首先,让我们来探讨一下OpenGL ES的基础概念: 1. **坐标系统**:OpenGL ES 使用右手...

    Android_OpenGL_ES_简明开发教程

    在OpenGLES 1.x中,1.0基于OpenGL 1.3规范,1.1基于OpenGL 1.5规范,并且分别支持common和commonlite两种profile,其中liteprofile仅支持定点数,而commonprofile支持定点数和浮点数。OpenGLES 2.0则基于OpenGL 2.0...

    android里使用OPENGL示例DEMO下载 三维图形DEMO

    这个"android里使用OPENGL示例DEMO下载 三维图形DEMO"是一个很好的起点,帮助初学者理解和实践OpenGL ES在Android应用中的应用。 首先,OpenGL ES的基本概念包括顶点、图元、着色器和缓冲区。顶点是构成图形的基本...

    Android的OPENGL,三角形绘制

    在Android设备上运行这个应用后,屏幕上将显示一个红色的三角形,这是OpenGL ES的基本绘图操作。当然,实际的项目可能会涉及到更复杂的几何形状、光照、纹理映射和其他高级特性,但这个例子为我们提供了一个理解...

Global site tag (gtag.js) - Google Analytics