知识AndroidESOpenGL(绘制知识角形图形顶点)

知识AndroidESOpenGL(绘制知识角形图形顶点)

OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。
OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。
IRIS GL是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是SGI公司便在IRIS GL的基础上开发了OpenGL。
OpenGL的英文全称是“Open Graphics Library”,顾名思义,OpenGL便是“开放的图形程序接口”。
虽然DirectX在家用市场全面领先,但在专业高端绘图领域,OpenGL是不能被取代的主角话不多说拿起键盘就是干。
OpenGL ES可以实现3D效果,而且在性能要求比较高的情况,或者一般的自定义View难以达到的效果可以考虑一下。
就像官方说的,OpenGL ES直接通过GPU进行图形加速,唯一的约束就是:你的想象力太贫乏。
这里就根据官方文档来学一下这个步1、准备工作,构建环境使用OpenGL ES最快捷的方式就是使用GLSurfaceView,如果要求的界面是全屏或者接近全屏展示的话,GLSurfaceView是很好的选择。
要想味道好,食材不能少:GLSurfaceView + GLSurfaceView.Renderer + Activity。
1.1、清单文件声明使用1.2、继承GLSurfaceViewGLSurfaceView相当于一个容器,OpenGL ES的绘制是在GLSurfaceView.Renderer中实现的。
1.3、创建ActivityGLSurfaceView有了,需要把其加入Activity中展示给用户1.4、创建GLSurfaceView.Renderer真正的绘制工作要通过实现GLSurfaceView这个内部类来实现这个类有3个方法:onSurfaceCreated() 在GLSurfaceView创建的时候调用一次,适合做一些初始化工作。
onDrawFrame() 重绘就会调用。
onSurfaceChanged() 在GLSurfaceView大小改变调用,比如旋转手机屏幕。
你可能发现这这方法里头GL10参数,而调用时候用的是OpengGL ES 2.0的api,这是因为Google开发者为了框架的简单,重用了方法。
到这里基本环境已经搭建好了,在此基础上就可以进行具体的绘制工作了。
2、定义好要绘制的图形千里之行始于足下,要想绘制复杂炫酷的图形,首先得学会简单的,比如画一个三角形。
2.1、定义三角形坐标值要想绘制出一个三角形,需要三个坐标值,简单点说就是三个点,我们知道,要确定一个点在3维空间中的位置,得有x,y,z三个轴,所以在正式绘制之前,通过一个float类型的顶点数组来确认这个三角形的坐标值。
上面定义的坐标是在GLSurfaceView的中间绘制一个三角形,在OpenGL中的坐标和Android本身的坐标是不一样的,所以你看到上面的坐标值中出现-0.5f这种奇怪的坐标值,在OpenGL中,坐标[0,0,0] (X,Y,Z)最终映射到界面上是GLSurfaceView的中点, [-1,-1,0] 是左下角, [1,1,0]是右上角。
需要再提一点,OpenGL里头是可以控制绘制图形正反面的,所以坐标的顺序在一些情况下是要考虑好的。
2.2、坐标数据写入缓冲区为了更高效率的把顶点坐标数值传递给OpenGL ES管线中,需要把数据先传入缓冲区,这个操作也是流水线式的。
3、开始绘制图形定义好绘制的三角形之后,就可以开始正式的绘制了,开不开心。
然而道路是曲折的,前途也是曲折的,绘制的过程着实是蛋疼得紧,即使是一个简简单单的三角形。
这里就按文档说得使用OpenGL ES 2.0 API进行绘制。
3.1、创建实例初始化三角形在绘制之前得先初始化之前准备的数据,在onSurfaceCreated()进行这个操作,onSurfaceCreated()只会被调用一次,为性能着想,在这里头进行初始化是最适合的。
3.2、着色器准备与加载使用OpenGL ES 2.0来绘制已经定义好的图形,不是你说绘制就绘制的,得先准备点调料。
顶点着色器 - 用来渲染形状的顶点,每个顶点会调用一次;片元着色器 - 通过颜色或纹理来渲染图形的表面,假定每个像素点会调用一次;Program对象 - 着色器要交给Program对象链接和使用。
需要至少一个顶点着色器和一个片元着色器,着色器经过编译之后要加到Program对象中。
下面就是最简单的着色器,顶点着色器把接收来的顶点坐标直接不做处理交给后续管线操作,片元着色器也是把接收的颜色值直接交到后续流程。
着色器使用OpenGL着色语言 (GLSL) 编写的,是一种专门用于图形渲染的语言,要编译之后才能交给OpenGL使用。
编译完着色器之后,交给Program之后链接一下,Program对象就可以用了。
这个编译过程只需要进行一次所以在构造方法里头操作。
3.3、图形绘制现在可以真正的绘制图形,要用OpenGL ES绘制的话,需要让渲染管线知道你想绘制什么以及怎么绘制,根据面向对象的观点,这个过程图形对象自己才知道,所以要在Triangle里头实现具体的绘制逻辑。
现在只要在Renderer的onDrawFrame()调用draw()方法进行绘制就好啦。
以下就是最终效果:我们致力于打造为广大的Android爱好者提供一个网络免费技术分享学习平台,每天进步一点点,每天收获一点点大家也可以加下我们的Android技术分享群:562270337,不管你是小白还是大牛,我都挺欢迎,不定期分享干货,每天直播分享技能,包括2017最新的Android企业案例学习资料和零基础入门教程和科技前沿技术,欢迎初学和进阶中的小伙伴,大家一起交流学习,共同进步!本微信公众号还在不断创新和完善中,分享我们的文章到微信朋友圈 QQ空间 可以截图发我们领取Android开发实战精美学习资料,只要分享越多,学习干货更多。

联系我们

在线咨询:点击这里给我发消息