`
guozhenqian
  • 浏览: 149572 次
  • 性别: 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 绘制简单图形的实现示例

    openGl ES又是什么? 相信很多人从事开发的都或多或少听到过有关OpenGl这个东西,但是平时用的少,只知道有这么个东西,而且学起来不简单,所以大多数人都不能讲出个个所以然来。 官方对OpenGl的描述为: OpenGL...

    opengl超级宝典

    第一部分包括第1章到第12章,介绍经典OpenGL绘图的所有基础知识,包括3D图形和OpenGL简介,OpenGL空间绘图,几何转换,颜色、材料和光照,纹理贴图,曲线和表面,管线,交互式图形等内容。第二部分包括第13章到第15...

    OpenGL超级宝典(第四版)

    第一部分包括第1章到第12章,介绍经典opengl绘图的所有基础知识,包括3d图形和opengl简介,opengl空间绘图,几何转换,颜色、材料和光照,纹理贴图,曲线和表面,管线,交互式图形等内容。第二部分包括第13章到第15...

    Android 4游戏编程入门经典

     5.5.3 androidgraphics:满足绘图需求  5.5.4 androidfastrenderview  5.6 androidgame:合并所有内容  5.7 小结 第6章 mr. nom入侵android  6.1 创建资源  6.2 建立项目  6.3 mrnomgame:主要活动  6.3.1 ...

    androidandengine3D引擎源码

    AndEngine是一款以OpenGLES方式进行画面渲染的2D游戏引擎,可以运行在支持Android 1.6及以上版本的系统当中。应该说,相较前文介绍的Libgdx引擎,AndEngine拥有更多的游戏组件与扩展功能。并且与Libgdx不同,它在...

    flutter_opengl:使用Flutter的Texture()小部件对OpenGL插件进行早期预览。 目前仅支持带有NDK的Android

    这并不是让开发人员在Flutter内编写OpenGL代码的一种约束,而是使您可以用C / C ++代码编写着色器和绘图框架函数。 该插件仅适用于Android OS,期待有人跨平台使用! 该示例提供了4个图形着色器类。 它们是Shader....

    Android开发权威指南 第二版

    主要内容包括Android的四大应用程序组件(Activity、Service、Content ...Android支持的各种组件技术、通信技术(蓝牙、NFC、网络等)、异步装载、推送技术、多媒体、2D绘图技术、OpenGL ES、桌面小部件、动态壁纸、...

    android游戏编程入门

     7.1 OpenGL ES概述以及关注它的  原因 219  7.1.1 编程模型:一个比喻 220  7.1.2 投影 221  7.1.3 规范化设备空间和视口 223  7.1.4 矩阵 223  7.1.5 渲染管道 224  7.2 开始之前 225  7.3 GLSurfaceView...

    疯狂Android讲义源码

     12.2 OpenGL和OpenGL ES简介 453  12.3 绘制2D图形 454  12.3.1 在Android应用中使用  OpenGL ES 454  12.3.2 绘制平面上的多边形 457  12.3.3 旋转 463  12.4 绘制3D图形 465  12.4.1 构建3D图形 465  ...

    Android开发权威指南

    主要内容包括Android的四大应用程序组件(Activity、Service、Content ...Android支持的各种组件技术、通信技术(蓝牙、NFC、网络等)、异步装载、推送技术、多媒体、2D绘图技术、OpenGL ES、桌面小部件、动态壁纸、...

    WebGL编程指南压缩包

    第6 章 OpenGL ES 着色器语言(GLSL ES) 185 回顾:基本着色器代码 186 GLSL ES 概述 186 你好,着色器! 187 基础 187 执行次序 187 注释 187 数据值类型(数值和布尔值) 188 变量 188 GLSL ES 是强类型...

    WebGL编程指南

    第6 章 OpenGL ES 着色器语言(GLSL ES) 185 回顾:基本着色器代码 186 GLSL ES 概述 186 你好,着色器! 187 基础 187 执行次序 187 注释 187 数据值类型(数值和布尔值) 188 变量 188 GLSL ES 是强类型...

    webgl编程指南及源码1/2

    第6 章 OpenGL ES 着色器语言(GLSL ES) 185 回顾:基本着色器代码 186 GLSL ES 概述 186 你好,着色器! 187 基础 187 执行次序 187 注释 187 数据值类型(数值和布尔值) 188 变量 188 GLSL ES 是强类型...

    webgl编程指南及源码2/2

    第6 章 OpenGL ES 着色器语言(GLSL ES) 185 回顾:基本着色器代码 186 GLSL ES 概述 186 你好,着色器! 187 基础 187 执行次序 187 注释 187 数据值类型(数值和布尔值) 188 变量 188 GLSL ES 是强类型...

    VideoRecorder:适用于 iOS 的视频录制模块。 使用 OpenGL

    录像机是使用OpenGLES记录屏幕的模块。 这是用 Objective-C 编写的,适用于 iOS。用法包括所需的框架AssetsLibrary.framework 核心媒体框架核心视频框架运行“准备”进行初始化。 第一个参数:当前视图控制器第二个...

    OPhone平台2D游戏引擎实现——物理引擎

    而圆形和矩形都是我们在点击屏幕时要释放的物体,前面我们说过,JBox2d中的图形部分在Ophone中不能用,所以我们会专门介绍如何通过Opengl ES来对图形图像进行渲染,另外,该示例中的这些物体都是通过纹理映射来将...

    用Rust编写的抗锯齿2D矢量绘图库-Rust开发

    用Rust写的抗锯齿2D矢量绘图库。 femtovg加入Discord频道...渲染是通过一个OpenGl(ES)3.0+后端完成的。 屏幕快照带有货物运行的演示运行--example演示带有货物运行的突破运行--example突破带有货物运行的SVG运行-示例

    iphone3开发基础教程

    12.5 一些OpenGL ES基础知识 325 12.5.1 构建GLFun应用程序 326 12.5.2 设计Nib、添加框架、运行应用程序 335 12.6 小结 335 第13章 轻击、触摸和手势 336 13.1 多触摸术语 336 13.2 响应者链 337 13.3 多触摸体系...

Global site tag (gtag.js) - Google Analytics