传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229

传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/leverage_1229

传送门☞GoF23种设计模式☞转载请注明☞http://blog.csdn.net/leverage_1229

在OpenGLES view上能够定义所绘制图形的形状,是创建高端图形应用杰作的第一步。如果你不懂得OpenGL ES定义图形对象的一些基本知识,那么使用起来可能有一点棘手。
这一节将介绍OpenGL ES相对于Android设备屏幕的坐标系,定义一个形状的基础知识,形状的外观,以及如何定义一个三角形和一个正方形。
一、定义一个三角形
OpenGL ES允许你使用三维空间坐标系来定义绘制对象。所以,在你想要绘制一个三角形之前,必须定义它的坐标。

在OpenGL中,典型的方式是定义一个浮点类型的顶点数组存放各个顶点坐标。为了获得更高的效率,应该将这些坐标都存放到一个ByteBuffer中,ByteBuffer会被传入OpenGL ES图形管道进行处理。
class Triangle {private FloatBuffer vertexBuffer;// 设置每个顶点的坐标数static final int COORDS_PER_VERTEX = 3;// 设置三角形顶点数组static float triangleCoords[] = { // 默认按逆时针方向顺序绘制0.0f,  0.622008459f, 0.0f,   // 顶-0.5f, -0.311004243f, 0.0f,   // 左底0.5f, -0.311004243f, 0.0f    // 右底};// 设置图形的RGB值和透明度float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 1.0f };public Triangle() {// 初始化顶点字节缓冲区,用于存放形状的坐标,ByteBuffer bb = ByteBuffer.allocateDirect(// (每个浮点数占用4个字节)triangleCoords.length * 4);// 设置使用设备硬件的原生字节序bb.order(ByteOrder.nativeOrder());// 从ByteBuffer中创建一个浮点缓冲区vertexBuffer = bb.asFloatBuffer();// 把坐标都添加到FloatBuffer中vertexBuffer.put(triangleCoords);// 设置buffer从第一个坐标开始读vertexBuffer.position(0);}
}

默认情况下,OpenGL ES 假定GLSurfaceView帧的中心是坐标系[0,0,0](X,Y,Z),[1,1,0]是右上角,[-1,-1,0]是左下角。有关这个坐标系统的说明,请参阅OpenGL ES开发人员指南。
注意这个形状的坐标是按逆时针方向定义的。绘制顺序很重要,因为它定义了哪个面是形状的正面,哪个面是反面。使用OpenGL ES的cullface特性,你可以只画正面不画反面。更多关于faces和culling的信息,请参阅OpenGL ES开发人员指南。
二、定义一个正方形
在OpenGL中定义三角形非常容易,如果想得到一个更为复杂的形状,比如说一个正方形,有很多方法可以做到,其中典型的做法是使用两个三角形集合而成。

在此之后,需要分别为两个三角形按逆时针方向定义这些顶点,并且将这些坐标值都存放到一个ByteBuffer中。为了避免分别为两个三角形定义两个坐标数组,我们使用一个绘制列表来告诉OpenGL ES图形管道如果绘制这些顶点。下面就是这个形状的代码:
class Square {private FloatBuffer vertexBuffer;private ShortBuffer drawListBuffer;// 设置每个顶点的坐标数static final int COORDS_PER_VERTEX = 3;static float squareCoords[] = { -0.5f,  0.5f, 0.0f,   // 左上-0.5f, -0.5f, 0.0f,   // 左下0.5f, -0.5f, 0.0f,   // 右下0.5f,  0.5f, 0.0f }; // 右上private short drawOrder[] = { 0, 1, 2, 0, 2, 3 }; // 设置顶点的绘制顺序public Square() {// 初始化顶点字节缓冲区,用于存放形状的坐标ByteBuffer bb = ByteBuffer.allocateDirect(// (每个浮点数占用4个字节)squareCoords.length * 4);bb.order(ByteOrder.nativeOrder());vertexBuffer = bb.asFloatBuffer();vertexBuffer.put(squareCoords);vertexBuffer.position(0);// 初始化字节缓冲区,用于存放绘制列表ByteBuffer dlb = ByteBuffer.allocateDirect(// (每个短整型占用2个字节drawOrder.length * 2);dlb.order(ByteOrder.nativeOrder());drawListBuffer = dlb.asShortBuffer();drawListBuffer.put(drawOrder);drawListBuffer.position(0);}
}

这个例子展示了如何使用OpenGL创建更为复杂的形状。一般来说,都是通过绘制三角形对象集合的方式来达到。在下一节中,你将了解如何在屏幕上画出这些形状。

使用Android OpenGL ES 2.0绘图之二:定义形状相关推荐

  1. 使用Android OpenGL ES 2.0绘图之三:绘制形状

    传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 在定义好待绘制的形状之后,就要开始绘制它们了.使用OpenGL ES 2.0绘制形状可 ...

  2. 使用Android OpenGL ES 2.0绘图之一:搭建一个OpenGL ES环境

    传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/levera ...

  3. 使用Android OpenGL ES 2.0绘图之五:添加运动

    传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/levera ...

  4. 使用Android OpenGL ES 2.0绘图之四:应用投影和相机视图

    传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/levera ...

  5. Android OpenGL ES 2.0 屏幕坐标和3D世界坐标转换

    Android OpenGL ES 2.0 屏幕坐标和3D世界坐标转换 查看全文 http://www.taodudu.cc/news/show-6705596.html 相关文章: word中如何加 ...

  6. Android opengl es 3.0 + ndk 绘画涂鸦项目

    前言 写一个opengl es 3.0 + ndk 的绘画涂鸦项目,命名为白板哈哈哈,记录自己遇到的问题,顺便学到的知识整合一遍,算是对自己一段时间的总结. 项目地址:Whiteboard 如果对你有 ...

  7. android opengl es 纹理 不同设备 白色,android – OpenGL ES 2.0纹理没有在某些设备上显示...

    早上好,这是2个纹理非幂的典型例子. 由于多种原因,纹理在分辨率上需要2的幂,这是一个非常常见的错误,每个人都碰巧陷入这个陷阱:)我也是. 2个纹理的非功率在某些设备/ GPU上运行平稳的事实,仅仅取 ...

  8. android opengl es 2.0 编程指南,Android OpenGL ES 2.0 初次体验

    本文目录 一. OpenGL ES是什么? 二. OpenGL ES的版本 三. EGL是什么? 四. 需要知道的两个方法 五. 在Android中使用OpenGL ES的步骤 六. 例子1:简单的程 ...

  9. Android OpenGL ES 2.0绘制简单三角形

    实现步骤 l  实现一个工具类ShalderUtil,用于将着色器代码加载进显卡进行编译 l  实现一个三角形Triangle类 在该类中加载着色器.初始化顶点数据.初始化着色器以及绘制三角形方法 l ...

最新文章

  1. 漫 谈oracle 中 的 空 值
  2. zabbix的日常监控-自动发现端口并监测(服务器开启的所有端口或监控指定端口)(十三)...
  3. Switch Case中的经典
  4. JavaScript正则表达式快速简单的指南
  5. html本地缓存未查看信息,不同用户看到了相同的信息-一次web系统缓存问题的解决...
  6. android开发常用技术,[转载]Android开发常用调试技术记录
  7. 浏览器解析html全过程详解
  8. 最近很喜欢Hello World啊,这次来Groovy的Hello World啦
  9. android x866.0 教程,海尔暴风AmlogicT866平台升级步骤教程
  10. 密码猴机器人编程合肥店_CES 2019:边搭积木边学编程 葡萄科技推出编程积木机器人PaiBots...
  11. 在什么情况下自己应该辞职走人了,而不是等领导下“逐客令”?
  12. http status code —— http 状态码
  13. java如果目录不存在则创建目录_java – 创建一个目录,如果它不存在,然后再创建该目录中的文件...
  14. Windows下安装numpy
  15. FPGA实现的线性反馈移位寄存器LFSR
  16. 中西方关于颜色的理解对比
  17. 巴菲特致股东的一封信:1996年
  18. 【Nodejs】使用request批量下载MP3,文件数量内容都没问题
  19. 江苏省电子税务局中文点选验证码识别研究
  20. c语言蟠桃记程序,HDU2013 蟠桃记

热门文章

  1. linux安装自带mysql吗_Linux安装mysql8
  2. 小程序 微信统计表格_微信小程序登录机制
  3. ofstream清空文件内容_回收站被删除的文件怎么恢复 回收站清空了怎么恢复
  4. 定时器的实现原理 不消耗cpu_一直在使用JDK动态代理, 不明白原理如何实现?
  5. 认真学习系列:Linux原理——《趣谈linux》学习笔记
  6. C++中有了malloc/free 为什么还要new/delete?
  7. 【4】测试用例设计-判定表法
  8. speak 计算机英语作文,跪求一篇英语作文 题目:论计算机的优缺点
  9. 使用Docker+Grafana+InfluxDB可视化展示Jenkins构建信息
  10. 最近两周的前后端交互