位置: 编程技术 - 正文

Android OpenGL 学习笔记 --开始篇(android native opengl)

编辑:rootadmin
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 OpenGL?  OpenGL 是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。OpenGL 的前身是 SGI 公司为其图形工作站开的 IRIS GL。IRIS GL 是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是 SGI 公司便在 IRIS GL 的基础上开发 OpenGL 。具体详细的介绍请 点击这里 。2、OpenGL 的发展历程  年7月 发布了 OpenGL 1.0 版本,并与微软共同推出 Windows NT 版本的 OpenGL 。  年 OpenGL 1.1 版本面市,加入了新功能,并引入了纹理特性等等。  一直到 年8月Khronos小组发布了OpenGL 3.2,这是一年以来OpenGL进行的第三次重要升级。具体特点及功能、 OpenGL 现状、发展历程、OpenGL 规范、编程入门请 点击这里 。3、OpenGL ES 简介 Android 3D 引擎采用的是OpenGL ES。OpenGL ES是一套为手持和嵌入式系统设计的3D引擎API,由Khronos公司维护。在PC领域,一直有两种标准的3D API进行竞争,OpenGL 和 DirectX。一般主流的游戏和显卡都支持这两种渲染方式,DirectX在Windows平台上有很大的优势,但是 OpenGL 具有更好的跨平台性。由于嵌入式系统和PC相比,一般说来,CPU、内存等都比PC差很多,而且对能耗有着特殊的要求,许多嵌入式设备并没有浮点运算协处理器,针对嵌入式系统的以上特点,Khronos对标准的 OpenGL 系统进行了维护和改动,以期望满足嵌入式设备对3D绘图的要求。4、<span times="" new="" roman'"="" style="padding: 0px; margin: 0px;"> Android OpenGL ES 简介Android系统使用 OpenGL 的标准接口来支持3D图形功能,android 3D 图形系统也分为 java 框架和本地代码两部分。本地代码主要实现的 OpenGL 接口的库,在 Java 框架层,javax.microedition.khronos.opengles 是 java标准的 OpenGL 包,android.opengl包提供了 OpenGL 系统和 Android GUI 系统之间的联系。 5、Android 支持 OpenGL 列表1、GL2、GL 、GL EXT4、GL 、GL EXT6、GL ExtensionPack我们将使用 GL 这个类开始接触 OpenGL ,探索3D 领域。6、一步一步实现自己的 Renderer 类在 Android 中我们使用 GLSurfaceView 来显示 OpenGL 视图,该类位于 android.opengl 包里面。它提供了一个专门用于渲染3D 的接口 Renderer 。接下来我们就来一步步构建自己的 Renderer 类。1、为 Renderer 类赶回命名空间import android.opengl.GLSurfaceView.Renderer; 2、新建一个类来实现 Renderer 接口,代码如下:public class ThreeDGl implements Renderer {} 3、如上代码所写,程序实现了 Renderer 类,则必须重写以下方法public void onDrawFrame(GL gl) {}public void onSurfaceChanged(GL gl, int width, int height){}public void onSurfaceCreated(GL gl, EGLConfig config){} 4、当窗口被创建时需要调用 onSurfaceCreate ,我们可以在这里对 OpenGL 做一些初始化工作,例如: // 启用阴影平滑 gl.glShadeModel(GL.GL_SMOOTH); // 黑色背景 gl.glClearColor(0, 0, 0, 0); // 设置深度缓存 gl.glClearDepthf(1.0f); // 启用深度测试 gl.glEnable(GL.GL_DEPTH_TEST); // 所作深度测试的类型 gl.glDepthFunc(GL.GL_LEQUAL); // 告诉系统对透视进行修正 gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_FASTEST); glHint 用于告诉 OpenGL 我们希望进行最好的透视修正,这会轻微地影响性能,但会使得透视图更好看。glClearColor 设置清除屏幕时所用的颜色,色彩&#;的范围从 0.0f~1.0f 大小从暗到这的过程。glShadeModel 用于启用阴影平滑度。阴影平滑通过多边形精细地混合色彩,并对外部光进行平滑。glDepthFunc 为将深度缓存设想为屏幕后面的层,它不断地对物体进入屏幕内部的深度进行跟踪。glEnable 启用深度测试。5、当窗口大小发生改变时系统将调用 onSurfaceChange 方法,可以在该方法中设置 OpenGL 场景大小 ,代码如下://设置OpenGL场景的大小gl.glViewport(0, 0, width, height); 6、场景画出来了,接下来我们就要实现场景里面的内容,比如:设置它的透视图,让它有种越远的东西看起来越小的感觉,代码如下://设置投影矩阵 gl.glMatrixMode(GL.GL_PROJECTION); //重置投影矩阵 gl.glLoadIdentity(); // 设置视口的大小 gl.glFrustumf(-ratio, ratio, -1, 1, 1, ); // 选择模型观察矩阵 gl.glMatrixMode(GL.GL_MODELVIEW); // 重置模型观察矩阵 gl.glLoadIdentity(); gl.glMatrixMode(GL.GL_PROJECTION); 指明接下来的代码将影响 projection matrix (投影矩阵),投影矩阵负责为场景增加透视度。 gl.glLoadIdentity(); 此方法相当于我们手机的重置功能,它将所选择的矩阵状态恢复成原始状态,调用 glLoadIdentity(); 之后为场景设置透视图。gl.glMatrixMode(GL.GL_MODELVIEW); 指明任何新的变换将会影响 modelview matrix (模型观察矩阵)。gl.glFrustumf(-ratio, ratio, -1, 1, 1, ); 此方法,前面4个参数用于确定窗口的大小,而后面两个参数分别是在场景中所能绘制深度的起点和终点。7、了解了上面两个重写方法的作用和功能之后,第三个方法 onDrawFrame 从字面上理解就知道此方法做绘制图操作的。嗯,没错。在绘图之前,需要将屏幕清除成前面所指定的颜色,清除尝试缓存并且重置场景,然后就可以绘图了, 代码如下:// 清除屏幕和深度缓存gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);// 重置当前的模型观察矩阵gl.glLoadIdentity(); 8、Renderer 类在实现了上面的三个重写之后,在程序入口中只需要调用Renderer render=new ThreeDGl(this); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GLSurfaceView gview=new GLSurfaceView(this); gview.setRenderer(render); setContentView(gview); } 即可将我们绘制的图形显示出来。下面分享一段使用Renderer类绘制的三角形和四边形的代码: OpenGL 参考代码package com.terry;import java.nio.IntBuffer;import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.opengles.GL;import android.opengl.GLSurfaceView.Renderer;public class GLRender implements Renderer{ float rotateTri,rotateQuad; int one=0x; //三角形的一个顶点 private IntBuffer triggerBuffer=IntBuffer.wrap(new int[]{ 0,one,0, //上顶点 -one,-one,0, //左顶点 one,-one,0 //右下点 }); //正方形的四个顶点 private IntBuffer quateBuffer=IntBuffer.wrap(new int[]{ one,one,0, -one,-one,0, one,-one,0, -one,-one,0 }); private IntBuffer colorBuffer=IntBuffer.wrap(new int[]{ one,0,0,one, 0,one,0,one, 0,0,one,one }); @Override public void onDrawFrame(GL gl) { // TODO Auto-generated method stub // 清除屏幕和深度缓存 gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // 重置当前的模型观察矩阵 gl.glLoadIdentity(); // 左移 1.5 单位,并移入屏幕 6.0 gl.glTranslatef(-1.5f, 0.0f, -6.0f); //设置旋转 gl.glRotatef(rotateTri, 0.0f, 1.0f, 0.0f); //设置定点数组 gl.glEnableClientState(GL.GL_VERTEX_ARRAY); //设置颜色数组 gl.glEnableClientState(GL.GL_COLOR_ARRAY); gl.glColorPointer(4, GL.GL_FIXED, 0, colorBuffer); // 设置三角形顶点 gl.glVertexPointer(3, GL.GL_FIXED, 0, triggerBuffer); //绘制三角形 gl.glDrawArrays(GL.GL_TRIANGLES, 0, 3); gl.glDisableClientState(GL.GL_COLOR_ARRAY); //绘制三角形结束 gl.glFinish(); /***********************/ /* 渲染正方形 */ // 重置当前的模型观察矩阵 gl.glLoadIdentity(); // 左移 1.5 单位,并移入屏幕 6.0 gl.glTranslatef(1.5f, 0.0f, -6.0f); // 设置当前色为蓝色 gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f); //设置旋转 gl.glRotatef(rotateQuad, 1.0f, 0.0f, 0.0f); //设置和绘制正方形 gl.glVertexPointer(3, GL.GL_FIXED, 0, quateBuffer); gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, 4); //绘制正方形结束 gl.glFinish(); //取消顶点数组 gl.glDisableClientState(GL.GL_VERTEX_ARRAY); //改变旋转的角度 rotateTri &#;= 0.5f; rotateQuad -= 0.5f; } @Override public void onSurfaceChanged(GL gl, int width, int height) { // TODO Auto-generated method stub float ratio = (float) width / height; //设置OpenGL场景的大小 gl.glViewport(0, 0, width, height); //设置投影矩阵 gl.glMatrixMode(GL.GL_PROJECTION); //重置投影矩阵 gl.glLoadIdentity(); // 设置视口的大小 gl.glFrustumf(-ratio, ratio, -1, 1, 1, ); // 选择模型观察矩阵 gl.glMatrixMode(GL.GL_MODELVIEW); // 重置模型观察矩阵 gl.glLoadIdentity(); } @Override public void onSurfaceCreated(GL gl, EGLConfig config) { // TODO Auto-generated method stub // 启用阴影平滑 gl.glShadeModel(GL.GL_SMOOTH); // 黑色背景 gl.glClearColor(0, 0, 0, 0); // 设置深度缓存 gl.glClearDepthf(1.0f); // 启用深度测试 gl.glEnable(GL.GL_DEPTH_TEST); // 所作深度测试的类型 gl.glDepthFunc(GL.GL_LEQUAL); // 告诉系统对透视进行修正 gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_FASTEST); }} 到此基本对 OpenGL 有一些了解,当然OpenGL 还有更多的东西需要我们去探索,努力吧。

推荐整理分享Android OpenGL 学习笔记 --开始篇(android native opengl),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android opengles,android opengl绘制图片,android opengles,android opengl yuv,android opengl绘图,android opengl yuv,android opengles,android opengl教程,内容如对您有帮助,希望把文章链接给更多的朋友!

Android OpenGL 学习笔记 --开始篇(android native opengl)

本文出自 “Terry_龙” 博客,请务必保留此出处

OpenGL天空地形,场景漫游 Camera.hcamera.cppCBMPLoader.hCBMPLoader.cppFont.hFont.cppGLFrame.hGLFrame.cppGLWindow.hGLWindow.cppSkyAndTerrain.hSkyAndTerrain.cppSkyBox.hSkyBox.cppstdafx.hstdafx.cppTerrain.hTerrain.cppVector.hVect

OpenGL进阶(十九) - 多光源 从光说起先看一段wiki中对光的定义光是一种人类眼睛可以见的电磁波(可见光谱),视知觉就是对于光的知觉[1]。光只是电磁波谱上的某一段频谱,一

OpenGL ES2.0-iPhone开发-part1 原文链接地址:

标签: android native opengl

本文链接地址:https://www.jiuchutong.com/biancheng/373150.html 转载请保留说明!

上一篇:windows visual studio openGL开发环境配置

下一篇:在Xcode中使用GLUT开发OpenGL应用程序(xcode用法)

  • 所得税 扣除
  • 医疗机构销售药品需要销售记录吗
  • 如何办理车辆购置置换补贴手续
  • 印花税应纳税额计算方法
  • 增值税进项税没那么多,申报表多填
  • 车辆购置税可以刷信用卡吗?
  • 公司之间往来款需要开收据吗
  • 库存商品发出汇总表
  • 自产自销农产品企业所得税
  • 红字发票可以开部分金额吗
  • 房地产开发企业预收款预缴增值税
  • 企业物流成本会计核算问题研究
  • 建筑施工安全费用专项检查报告怎么写
  • 收到一张建筑服务*施工费发票
  • 报销凭证找不到了怎么办
  • 产品成本核算的一般程序
  • 建筑劳务公司派遣人员工资发放凭证
  • 建筑行业增值税税率是多少
  • 电费先付后开票怎么做账
  • 特定业务预缴所得税不能填写
  • 独立核算分公司可以享受小型微利企业优惠吗
  • 公司周年庆典费用计入什么科目
  • 建筑业可以开电费发票吗
  • 社保已申报但未缴费有什么影响
  • 企业减免企业所得税怎么算
  • 印花税是怎么计税的
  • 股东变更交印花税会计分录
  • 什么叫做区分
  • 期初未缴纳税额负数
  • 公司与个人的往来款怎么处理
  • 土地出让金土地使用税
  • 发票认证了,但是没有入账
  • pdv文件什么意思
  • 整体租赁经营模式是什么
  • vue3 global
  • 一个简单的html文档一般且必须包含哪些标签
  • 小规模纳税人和一般纳税人的区别
  • thinkphp获取get传值
  • vue2vue3的区别
  • dns域名解析两种方式
  • php过滤html
  • php简单统计中文字符
  • 出口企业的出口比例怎么算
  • 出差费用计入
  • 社保费怎么做记账凭证
  • mybatis的
  • 安装mysql5.1的步骤和方法
  • python怎么用?
  • 母公司借款给子公司如何做账
  • 一般纳税人报税时间每月的多少号
  • 小规模普票怎么开
  • 财政补助资金不需要政府采购
  • 债权投资的交易费用计入成本还是利息调整
  • 外出经营预交企业所得税税率
  • 融资租赁收到的租金计入什么科目
  • 工会经费结余可以结转下年吗
  • 直接人工标准工时计算公式
  • 2020公司年会奖品清单
  • mysql格式化日期yyyy/mm/dd
  • windows mysql5.5升级5.7
  • windows server 2003如何安装
  • centos挂载点
  • ubuntu on xorg
  • smss.exe什么意思
  • win10天气预报设置
  • win7右下角无线网络连接图标不见了
  • linux查看使用率命令
  • android源码分析实录
  • cpu时钟预取实例是什么
  • 如何给图像应用css滤镜处理效果
  • python对excel操作真的有提高吗
  • 深入php面向对象、模式与实践第5版 电子书
  • diy相册设计
  • javascript indexOf函数使用说明
  • python的读取和写入
  • 中国税务主旨是什么?
  • 无经营公司
  • 电子税务局如何查询财务报表
  • 营业税发票现在可以冲红么
  • 国家税务总局云平台网址
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设