最全的AndroidOpenGL开发文档
AndroidOpenGL教程-第三课【转】
AndroidOpenGL教程-第三课【转】第三课给多边形上⾊:作为第⼆课的扩展,我将叫你如何使⽤颜⾊。
你将理解两种着⾊模式,在左图中,三⾓形⽤的是光滑着⾊,四边形⽤的是平⾯着⾊。
这次增加的代码不算多。
增加⼀个color的buffer在OpenGLRenderer类中定义颜⾊数组:private float[] mColorArray={1f,0f,0f,1f, //红0f,1f,0f,1f, //绿0f,0f,1f,1f //蓝};private FloatBuffer mColorBuffer;在onDrawFrame函数中加⼊:gl.glTranslatef(-1.5f, 0.0f, -6.0f);// gl.glColor4f(1f, 1f, 1f, 1f); 注释掉原来的三⾓形的红⾊//设置定点数组gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//设置颜⾊数组 -- 开启颜⾊渲染功能.gl.glEnableClientState(GL10.GL_COLOR_ARRAY);//使⽤数组作为颜⾊gl.glColorPointer(4, GL10.GL_FLOAT, 0, mColorBuffer);//数组指向⼀个buffergl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer);//绘制三⾓形gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);在onSurfaceCreated函数中初始化mColorBuffer:mColorBuffer = BufferUtil.floatToBuffer(mColorArray);这样话出⼀个颜⾊渐变的三⾓形画四边形加上这⼀句,就出来了蓝⾊的四边形//关闭颜⾊数组 -- 关闭颜⾊渲染功能. (原⽂中没有这句,只有后⾯那句) gl.glDisableClientState(GL10.GL_COLOR_ARRAY);gl.glColor4f(0.5f, 0.5f, 1f, 1f);好了,我今天⽆意中看到了⼀个IPHONE的opengles教程,和我的很类似,所以学学openggl是必要的,上层的什么平台不重要,⽤什么语⾔不重要,底层的opengl的代码和API都是⼀样的。
开发步骤_Android 3D游戏开发技术宝典——OpenGL ES 2.0_[共3页]
Android 3D游戏开发技术宝典406V'代表沿光线投影到绘制阴影的平面上顶点的坐标。
S为光源的位置。
V为投影前顶点的实际位置。
n为法向量,其属于绘制阴影的平面。
A为任意一个点的坐标,其位于绘制阴影的平面上。
•代表向量的点积计算。
提示实际计算时上述这些量都是在着色器中用vec3类型的变量来实现,具体情况下一小节会进行详细介绍。
15.7.2 开发步骤了解了案例的运行效果及基本原理后,就可以进行案例的开发了,具体步骤如下。
(1)首先用3DMax生成5个基本物体(平面、圆环、茶壶、立方体、圆球),并导出成obj文件放入项目的assets目录待用。
(2)开发出搭建场景的基本代码,包括:加载物体、摆放物体、计算光照等。
这些代码与前面章节的许多案例基本套路完全一致,因此这里不再赘述。
提示需要注意的是,为了达到更好的光照效果,立方体和平面使用的加载方法采用的是面法向量,而圆环、茶壶和圆球使用的加载方法采用的是点平均法向量,因此用于完成加载的工具类LoadUtil中就有两个不同的加载方法,loadFromFileVertexOnlyAverage与loadFromFileVertexOnlyFace。
其中第一个采用点平均法向量,第二个采用面法向量,代码与第9章案例中的相同。
(3)采用平面阴影技术实施阴影时,需要阴影的物体应该绘制两次,第一次绘制阴影,第二次绘制物体本身。
因此MySurfaceView中绘制场景的代码也会有所不同,具体内容如下。
代码位置:见随书光盘中源代码/第15章/Sample15_7com/bn/Sample15_7目录下的MySurfaceView.java。
1 public void onDrawFrame(GL10 gl) {2 ……//此处省略了设置摄像机、光源与清除缓冲的代码,与前面很多案例中的相同4 pm.drawSelf(0); //绘制平面5 drawObject(1); //绘制平面上各个物体的阴影6 drawObject(0); //绘制物体本身7 }8 public void drawObject( //绘制平面上物体的方法9 int situ) { //根据参数的不同决定绘制阴影还是物体本身10 MatrixState.pushMatrix(); //保护现场11 MatrixState.scale(1.5f, 1.5f, 1.5f); //进行缩放变换12 MatrixState.translate(-10f, 0f, 0); //进行平移变换13 cft.drawSelf(situ); //绘制长方体14 MatrixState.popMatrix(); //恢复现场15 ……//此处省略球体、圆环和茶壶的绘制代码,方法与绘制长方体的相同。
AndroidOpenGL应用开发
{ ... //下面是必须实现的三个抽象方法 public void onDrawFrame(GL10 gl){} public void onSurfaceCreated(GL10 gl, EGLConfig config){} public void onSurfaceChanged(GL10 gl, int width, int height){} ...
【实验原理】
滴定前 Zn + In(蓝色)==== ZnIn(紫红色) 滴定中 Zn + Y ==== ZnY 终点时 ZnIn(红色)+ Y ====ZnY + In(纯蓝色)
【仪器和试剂】
仪器:铁架台、蝴蝶夹、酸式滴定管、50 mL移液管、250 mL锥形瓶、玻璃瓶、量 筒 试剂:乙二胺四乙酸二钠(固体)、氧化锌、NH3·H2O-NH4Cl缓冲溶液、 【实验内铬容黑】T指示剂、6 mol•L-1HCl;
1.EDTA溶液的配制和标定 (1)0.01mol•L-1 EDTA溶液的配制
称取1.9g乙二胺四乙酸二钠与250 mL烧杯中,加水约100 mL,微热使其完全 溶解。溶解后转入500mL容量瓶中,加水稀释至500 mL,摇匀。贴上标签,备用。
【实验内容】
(2)以氧化锌为基准物标定EDTA 准确称取氧化锌0.25-0.28g,再加入6mol•L-1HCl溶解氧化锌,用少量蒸馏水冲洗烧
第10章 AndroidOpenGL应用开发
10.1.2 OpenGL视图显示
➢ 简介
Android系统提供了GLSurfห้องสมุดไป่ตู้ceView来显示OpenGL视图,其中包含一个专门用来渲染3D效果的Renderer接口。开发者 可以自定义一个Renderer类,只是需要引入接口:import android.opengl.GLSurfaceView.Renderer;
AndroidOpenGL开发---概念与入门
AndroidOpenGL开发---概念与⼊门内容参考⾃官⽅资料和。
下篇博⽂:OpenGL 与 OpenGL ESOpenGL(Open Graphics Library,译名:开放图形库或者“开放式图形库”)是⽤于渲染 2D、3D ⽮量图形的跨语⾔、跨平台的应⽤程序编程接⼝(API)。
OpenGL 不仅语⾔⽆关,⽽且平台⽆关。
OpenGL 纯粹专注于渲染,⽽不提供输⼊、⾳频以及窗⼝相关的 API。
这些都有硬件和底层操作系统提供。
OpenGL 的⾼效实现(利⽤了图形加速硬件)存在于 Windows,部分 UNIX 平台和 Mac OS,可以便捷利⽤显卡等设备。
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的⼦集,针对⼿机、PDA和游戏主机等嵌⼊式设备⽽设计。
经过多年发展,现在主要有两个版本,OpenGL ES 1.x 针对固定管线硬件的,OpenGL ES 2.x 针对可编程管线硬件。
Android 2.2 开始⽀持 OpenGL ES 2.0,OpenGL ES 2.0 基于OpenGL 2.0 实现。
⼀般在 Android 系统上使⽤ OpenGL,都是使⽤ OpenGL ES 2.0,1.0 仅作了解即可。
EGLEGL(Embedded Graphics Library)实际上是OpenGL和设备(⼜或者叫操作系统)间的中间件,因为 OpenGL 是平台⽆关的,是标准的,但设备是千奇百怪的,要对接就需要⼀个中间件做协调。
也就是说⼀个设备要⽀持 OpenGL,那么它需要开发⼀套相对应的 API 来对接。
在 Android 中就是 EGL。
EGL 主要负责初始化 OpenGL 的运⾏环境和设备间的交互,简单的说就是 OpenGL 负责绘图,EGL 负责和设备交互。
实际上,OpenGL ES 定义了⼀个渲染图形的 API,但没有定义窗⼝系统。
AndroidOpenGL基本结构
AndroidOpenGL基本结构android是用OpenGL来实现3d的。
OpenGL的处理机制是把所有的数据都用代码传递给opengl service,如果用户(这里是应用程序)想要画什么东西,就用告诉opengl 什么东西是可用的,然后在开始画。
这个例子一共分三步:1."画"一个3d的图形(这里画的是菱形),把它传递给opengl service 端,然后建立一个画自己的方法。
2.创建这个图形运行的环境。
3.把这个环境,加载到android 的界面上去。
下面是具体的实现方法:首先需要建两个array,第一array是用来告诉opengl这个图形有哪些顶点:画一个三维的坐标轴,然后把你要画的点都算出来,然后放在这个array里。
float l=1.5f;float[] vertex={0.0f,l,0.0f,l,0.0f,0.0f,0.0f,0.0f,l,-l,0.0f,0.0f,0.0f,0.0f,-l,0.0f,-l,0.0f};第二个array是告诉opengl 你要怎样组织这些点:这里我要画三角形,所以每三个点是一组。
byte[] edge={0,1,2,1,2,5,0,2,3,5,2,3,0,3,4,5,3,4,0,4,1,5,4,1};这里的数字,是第一个array的index。
下面你要建立两个Buffer它们是用来存放这两个array的。
ByteBuffer bb = ByteBuffer.allocateDirect(vertex.length*4); bb.order(ByteOrder.nativeOrder());fbv=bb.asFloatBuffer();fbv.put(vertex);fbv.position(0);ffe=ByteBuffer.allocateDirect(edge.length);ffe.put(edge);ffe.position(0);这样一个三维的菱形就画好了。
10Android多媒体开发-OpenGL
一个像素在前面,哪一个像素被遮挡;
模版测试:将模版缓存中的值与一个参考值进行比较,从而进行相应的
处理。
OpenGL ES 1.x的渲染管线
混合:是将片元的颜色和帧缓冲区中已有的颜色值进行混
合,并将混合所得的新值写入帧缓冲;
定义渲染管线的OpenGL ES 2.0。
使用OpenGL ES 2.0渲染的3D场景更加真实从而能够创造全新
的用户体验。
OpenGL ES 3.0则是最新的移动图形标准规范(Android4.3) 。它意味着提升设备的屏幕画质,增强3D游戏的画面体验。
OpenGL ES
基于OpenGL ES 2.0的3D应用不能在模拟器上运行,必须
基本处理:该阶段设定3D空间中物体的顶点坐标、顶点对应 的颜色、顶点的纹理坐标等属性并制定绘制方法(点绘制、 线段绘制、三角形绘制)。 顶点缓冲对象:可选功能,在顶点数据不变的情况下,初始 化后可把顶点数据处理后放入顶点缓冲对象,省去I/O开销, 提高渲染效率。 变换和光照:
进行顶点变换(平移、旋转或缩放等)
根据程序中设置的光照属性对顶点进行光照计算根据程序送入的光源位置性质各通道强度物体的材质等依据一定的光照数学模型计算各顶点的光照情况
9.1 OpenGL ES
OpenGL ES(OpenGL for Embedded System),是基于 OpenGL三维图形API的子集,主要针对于手机以及PDA等嵌 入式设备设计的。 随着Android系统版本以及硬件水平的提升,OpenGL ES版本 也由原先仅支持固定渲染管线的OpenGL ES 1.X升级为支持自
Android开发与实践第12章利用OpenGL实现3D图形
glClearColor(float red, float green, float blue, float alpha) glDisable(int cap) glEnable(int cap) glFrustumf(float left, float right, float bottom, float top, float zNear, float zFar) glHint(int target, int mode) glLoadIdentity() glMatrixMode(int mode) glShadeModel(int mode) glViewport(int x, int y, int width, int height) 用于指定清除屏幕时使用的颜色,4个参数分别用于设置红、 绿、蓝和透明度的值,值的范围是0.0f~1.0f 用于禁用OpenGL ES某个方面的特性。例如,要关闭抗抖动功 能,可以使用gl.glDisable(GL10.GL_DITHER);语句 用于启用OpenGL ES某个方面的特性 用于设置透视视窗的空间大小 用于对OpenGL ES某个方面进行修正 用于初始化单位矩阵 用 于 设 置 视 图 的 矩 阵 模 式 。 通 常 可 以 使 用 GL10.GL_MODELVIEW和GL10.GL_PROJECTION两个常量值 用于设置OpenGL ES的阴影模式。例如,要设置为平滑模式, 可以使用gl.glShadeModel(GL10.GL_SMOOTH);语句 用于设置3D场景的大小
OpenGL ES 2.x(针对可编程管线硬件)两个版本。OpenGL ES 1.0是以 OpenGL 1.3规范为基础的,OpenGL ES 1.1是以OpenGL 1.5规范为基础的, OpenGL ES 2.0 则是参照OpenGL 2.0规范定义的,它补充和修改了OpenGL ES 1.1标准着色器语言及API,将OpenGL ES 1.1中所有可以用着色器程序 替换的功能全部删除了,这样可以节约移动设备的开销及电力消耗。 说明: OpenGL ES可以应用于很多主流移动平台上,包括Android、Symbian和 iPhone等。 Android为OpenGL提供了相应的支持,它专门为支持OpenGL提供了 android.opengl包。在该包中,GLES10类是为支持OpenGL ES 1.0而提供的 ;GLES11类是为支持OpenGL ES 1.1而提供的,GLES20类是为支持OpenGL ES 2.0而提供的。其中,OpenGL ES 2.0是从Android 2.2(API Level 8) 版本才开始使用的。 如果你的应用只支持OpenGL ES 2.0,你必须在该项目的 AndroidManifest.xml文件中添加下列设置:
开发步骤_Android 3D游戏开发技术宝典——OpenGL ES 2.0_[共3页]
Android 3D游戏开发技术宝典
382器中根据传入的相关参数实时计算出来的,基本思想如图15-3所示。
▲图15-3 投影贴图的基本原理
从图15-3中可以看出,此案例中最重要的工作就是在着色器中根据光源位置、透明胶片纹理图的位置、尺寸及片元的位置计算出片元对应的纹理坐标。
这项工作如果直接用空间解析几何计算虽然是可以完成的,但会非常烦琐。
其实转变一下思维方式就很容易实现,可以在光源处虚拟一个摄像机,对应于此虚拟摄像机的投影参数进行如下设置。
将left与right各设置为0.5,总和为1,代表透明胶片纹理图的宽度纹理坐标跨度。
将top与bottom也各自设置为0.5,总和为1,代表透明胶片纹理图的高度纹理坐标跨度。
将near设置为透明胶片距光源的距离,far设置为不小于光源到需要照射的最远物体的距离。
然后将摄像机观察矩阵及投影矩阵的组合矩阵传入着色器,在着色器中将片元位置与此矩阵进行运算即可计算出此片元位置投影到光源处虚拟摄像机近平面上的位置。
由于前面将近平面的尺寸设置为1.0×1.0了,所以此近平面上的位置可以非常方便地换算成合法的纹理坐标,如图15-4所示。
▲图15-4 纹理坐标换算
从图中可以看出换算公式为。
s=x+0.5 t=y+0.5
计算出纹理坐标后就非常简单了,只需要将纹理坐标传递给纹理采样函数进行纹理采样即可得到片元的颜色,投影贴图也就实现了。
15.1.2 开发步骤
了解了案例的运行效果及基本原理后,就可以进行案例的开发了,具体步骤如下。
(1)首先用3DMax生成5个基本物体(平面、圆环、茶壶、立方体、圆球),并导出成obj文。
开发步骤_Android 3D游戏开发技术宝典——OpenGL ES 2.0_[共3页]
Android 3D游戏开发技术宝典360XSpan= X1- X0YSpan= Y1- Y0(3)接着就可以求出OD与X轴正方向的夹角θ,具体情况如下。
如果XSpan=0,并且YSpan大于0,那么θ=π/2。
如果XSpan=0,并且YSpan小于0,那么θ=3π/2。
如果XSpan不等于0,那么θ=atan(YSpan/ XSpan)。
(4)然后计算旋转后的D点与X轴正方向的夹角θ'。
θ'=θ+ratio×OD说明其中ratio表示与当前总体旋转角度线性相关的一个系数,用于将距离转化为当前考察点的旋转角度。
(5)计算出旋转后的夹角后,就可以求出旋转后点的X、Y坐标了。
X1'= X0+ OD×cos(θ')Y1'= Y0+ OD ×sin(θ')只需要用顶点着色器实现上述算法即可得到非常漂亮的二维扭曲效果。
13.5.2 开发步骤上一小节中介绍了二维扭曲的基本原理以及注意事项,本小节将给出一个三角形二维扭曲的案例Sample13_5,其运行效果如图13-17所示。
▲图13-17 案例Sample13_5的运行效果图了解了案例的运行效果后,接下来将对本案例的具体开发过程进行简要介绍。
由于本案例中的大部分类和前面章节很多案例中的非常类似,因此在这里只给出本案例中比较有代表性的部分,具体内容如下所列。
(1)从前面的介绍中已经知道,本案例中的大三角形实际上是由很多小三角形构成的。
因此下面首先给出的是自动生成各个小三角形顶点数据的initVertexData方法,其来自MultiTrangle类,具体代码如下。
代码位置:见随书光盘中源代码/第13章/Sample13_5/com/bn/Sample13_5目录下的MultiTrangle.java。
1 public void initVertexData(float edgeLength,int levelNum) {。
Android OpenGL
OpenGL- ES 是免授权费的,跨平台的,功能完善的2D和3D图形应用程序接口API,主要针对多种嵌入式系统专门设计 - 包括控制台、移动电话、手持设备、家电设备和汽车。
它由精心定义的桌面OpenGL子集组成,创造了软件与图形加速间灵活强大的底层交互接口。
Android中也采用OpenGL-ES来实现,下面是eoeandroid开发者社区为大家整理的系统知识汇总:一.实例教程:Android图形图像处理openGL实例篇1. OpenGL实现Ophone3D效果特效,有源码。
/thread-42994-1-1.html2. OpenGL 3D立方体多纹理贴图【附源码】/thread-44154-1-1.html3. 开发框架搭建、三角形和四边形的绘制/thread-20297-1-1.html4. 3D空间效果/thread-20318-2-1.html5. 颜色和旋转/thread-20309-1-1.html6. 读取stl文件,并用OpenGL显示/thread-30971-1-1.html7. OpenGL做的曲面卷动效果/thread-57147-1-1.html8. OpenGL 3d骰子9. OpenGL skia介绍/thread-62929-1-1.html 10. openGL 3D播放器/thread-97320-1-1.html 11. OpenGL 绘制飘动的国旗效果/thread-94897-1-1.html 12. OpenGL 绘制圆形和灯光效果设置/thread-95965-1-1.html 13. OpenGL ES 图像翻转/thread-154316-1-1.html 14. OpenGL 基础实例/thread-113899-1-1.html 15. OpenGL 绘制五角星效果/thread-94899-1-1.html 16. OpenGL 绘制圆柱体/thread-95104-1-1.html 17.OpenGL 拼图游戏/thread-94902-1-1.html 18. Android下Opengl ES导引/thread-93532-1-1.html 19. Android 里的FrameBuffer20.OpenGL 实例/thread-75030-1-1.html21. ndk在windows和ubuntu下配置OpenGL/thread-58572-1-1.html22.openGL ES 绘制3D图形/thread-52528-1-1.html 二.Android图形图像处理openGL资料篇1. OpenGL ES2.0 Programming Guide(PDF)/thread-43531-1-1.html2.OpenGL三维图形编程指南/thread-48970-1-1.html3. OpenGL1.0和1.1扩展包PDF/thread-49420-1-1.html4. openGL资料/thread-5862-1-1.html/thread-55952-1-1.html (基础入门)5. Pro Android eBook G1/thread-4210-1-1.html6. Android Graphic的介绍/thread-25193-1-1.html7. OpenGL核心函数库8.OpenGL开发文档/thread-53896-1-1.html 9.OpenGL三维图形编程指南/thread-48970-1-1.html 10. OpenGL ES 学习阶段性总结/thread-72898-1-1.html 三.Android图形图像处理openGL问题篇(已解决)1. Must use a native order direct Buffer错误/thread-30645-1-1.html2. android中用OpenGL画球/thread-26547-1-1.html ng.VerifyError错误/thread-698-1-1.html 4.OpenGL ES 中图形覆盖问题/thread-45552-1-1.html5.called unimplemented OpenGL ES API错误/thread-40713-1-1.html6.openGL贴图真机无法显示问题/thread-25416-2-1.html 7.OpenGL ES的一个图片展示效果/thread-97246-1-1.html四. Android图形图像处理openGL问题篇(未解决)1. gallery3d流程(探索中)/thread-40903-1-1.html2. openGL真机运行错误/thread-32728-1-1.html3. OpenGL ES于ar的应用(拾取)/thread-41758-1-1.html4. OpenGL 动态壁纸/thread-47545-1-1.html5.NDK调用Opengl刷新SurfaceView的画面抖动问题/thread-37045-1-1.html6. OpenGL2.0以下宽高非2^N纹理图片如何显示/thread-99235-1-1.html。
Android开发与实践-利用OpenGL实现3D图形
用于设置3D场景的大小
12.2.2 绘制一个模型
在基本框架构建完成后,我们就可以在该框架的基础上绘制3D模型了。在
OpenGL ES中,任何模型都会被分解为三角形。下面将以绘制一个2D的三角
OpenGL ES 2.x(针对可编程管线硬件)两个版本。OpenGL ES 1.0是以 OpenGL 1.3规范为基础的,OpenGL ES 1.1是以OpenGL 1.5规范为基础的, OpenGL ES 2.0 则是参照OpenGL 2.0规范定义的,它补充和修改了OpenGL ES 1.1标准着色器语言及API,将OpenGL ES 1.1中所有可以用着色器程序 替换的功能全部删除了,这样可以节约移动设备的开销及电力消耗。 说明: OpenGL ES可以应用于很多主流移动平台上,包括Android、Symbian和 iPhone等。 Android为OpenGL提供了相应的支持,它专门为支持OpenGL提供了 android.opengl包。在该包中,GLES10类是为支持OpenGL ES 1.0而提供的; GLES11类是为支持OpenGL ES 1.1而提供的,GLES20类是为支持OpenGL ES 2.0而提供的。其中,OpenGL ES 2.0是从Android 2.2(API Level 8)版 本才开始使用的。 如果你的应用只支持OpenGL ES 2.0,你必须在该项目的 AndroidManifest.xml文件中添加下列设置:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
Android OpenGL ES 简明开发教程
Android OpenGL ES 简明开发教程一、概述ApiDemos 的Graphics示例中含有OpenGL ES 例子,OpenGL ES 主要用来开发3D图形应用的。
OpenGL ES (OpenGL for Embedded Systems) 是OpenGL 三维图形API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。
下面是维基百科中对应OpenGL ES的简介:OpenGL ES 是从OpenGL 裁剪定制而来的,去除了glBegin/glEnd,四边形(GL_QUADS)、多边形(GL_POLYGONS)等复杂图元等许多非绝对必要的特性。
经过多年发展,现在主要有两个版本,OpenGL ES 1.x 针对固定管线硬件的,OpenGL ES 2.x 针对可编程管线硬件。
OpenGL ES 1.0 是以OpenGL 1.3 规范为基础的,OpenGL ES 1.1 是以OpenGL 1.5 规范为基础的,它们分别又支持common 和common lite 两种profile。
lite profile只支持定点实数,而common profile既支持定点数又支持浮点数。
OpenGL ES 2.0 则是参照OpenGL 2.0 规范定义的,common profile发布于2005-8,引入了对可编程管线的支持。
在解析Android ApiDemos 中OpenGL ES示例前,有必要对OpenGL ES 开发单独做个简明开发教程,可以帮助从未接触过3D开发的程序员了解OpenGL 的开发的基本概念和方法,很多移动手机平台都提供了对OpenGL ES 开发包的支持,因此尽管这里使用Android平台介绍OpenGL ES ,但基本概念和步骤同样适用于其它平台。
简明开发教程主要参考Jayway Team Blog中OpenGL ES开发教程,这是一个写的比较通俗易懂的开发教程,适合OpenGL ES初学者。
开发步骤_Android 3D游戏开发技术宝典——OpenGL ES 2.0_[共6页]
第19章 游戏开发小贴士53119-4所示。
▲图19-4 通过A 点坐标求B 点坐标从图19-4中可以看出,根据相似三角形的原理,X A 、X B 、near 、far 之间满足如下等式。
X A /X B =near/far同理,Y A 、Y B 、near 、far 之间满足如下等式。
Y A /Y B =near/far综上,求得的B 点坐标如下。
[far •X A /near, far •Y A /near, -far]求得A 、B 两点在摄像机坐标系中的坐标之后,再将此坐标经摄像机矩阵的逆矩阵变换即可得到A 、B 两点在世界坐标系中的坐标。
顺利求得A 、B 两点在世界坐标系中的坐标后,就可以轻松得出线段AB 的解析方程,并计算出距离A 点最近的交点以求出当前被选中的物体了。
提示 求最近交点的方法与前面第15章中光线跟踪采用的方法类似,这里就不再赘述了,需要的读者请参考第15章中介绍光线跟踪的相关部分。
19.1.2 开发步骤上一小节介绍了3D 拾取技术的基本原理及案例的运行效果,本小节将介绍如何进行本节案例的开发。
由于本节案例中很多类与前面不少案例中的非常类似,因此这里仅介绍与3D 拾取密切相关的部分,具体内容如下。
(1)首先在MatrixState 类中增加求摄像机矩阵逆矩阵的getInvertMvMatrix 方法以及将摄像机坐标系中坐标变换为世界坐标系中坐标的fromPtoPreP 方法,具体代码如下。
代码位置:见随书光盘中源代码/第19章/Sample19_1/com/bn/Sample19_1目录下的MatrixState.java 。
1 public static float[] getInvertMvMatrix(){ //获取摄像机矩阵的逆矩阵的方法2 float[] invM = new float[16];3 Matrix.invertM(invM, 0, mVMatrix, 0); //求摄像机矩阵的逆矩阵4 return invM;5 }6 public static float[] fromPtoPreP(float[] p){ //将摄像机坐标系中坐标变换为世界坐标系中坐标7 float[] inverM = getInvertMvMatrix(); //获取摄像机矩阵的逆矩阵8 float[] preP = new float[4]; //用于存储结果坐标的数组9 Matrix.multiplyMV(preP, 0, inverM, 0, new float[]{p[0],p[1],p[2],1}, 0); //求世界坐标系中的坐标Android 3D游戏开发技术宝典53210 return new float[]{preP[0],preP[1],preP[2]}; //返回世界坐标系中的坐标11 }(2)接下来开发计算AB两点坐标的工具类IntersectantUtil,其代码如下。
Android上的OpenGLES学习和开发
Android上的OpenGLES学习和开发Android操作系统的广泛应用使得移动设备成为了我们日常生活中不可或缺的一部分。
而作为移动设备的核心,图形处理与展示技术在Android开发中具有极其重要的地位。
在这方面,OpenGLES(OpenGL for Embedded Systems)是一种强大的图形库,为开发者提供了丰富的图形渲染和处理功能。
本文将介绍Android上的OpenGLES学习和开发,帮助读者了解OpenGLES的基本概念和使用方法。
一、OpenGLES简介OpenGLES是一种为嵌入式系统设计的OpenGL API子集,针对移动设备的图形处理进行了优化。
Android平台支持OpenGLES的版本从1.0到3.2,每个版本都有其特定的功能和要求。
使用OpenGLES可以实现动画、游戏、虚拟现实等各种交互式图形应用。
二、OpenGLES开发环境的搭建1. 安装Android StudioAndroid Studio是官方推荐的Android开发工具,提供了丰富的开发功能和调试工具。
在官方网站上下载并安装Android Studio。
2. 配置开发环境在安装Android Studio后,需要按照步骤进行配置,并安装相应的SDK和NDK,以便支持OpenGLES开发。
三、OpenGLES基本概念和使用方法1. 图形渲染管线图形渲染管线是OpenGLES中实现图形渲染的核心部分。
它包括顶点着色器、片段着色器和几何着色器等多个阶段。
了解图形渲染管线的工作流程对于理解OpenGLES的渲染过程非常重要。
2. 图形数据加载与绘制在OpenGLES中,图形数据的加载和绘制是实现图形渲染的基础。
开发者需要了解如何创建和管理顶点缓冲区、纹理缓冲区等数据结构,以及如何使用着色器程序进行绘制。
3. 着色器编写与编译着色器是OpenGLES中实现图形处理的关键。
了解如何编写有效的顶点着色器和片段着色器,并进行编译和链接是学习OpenGLES的重要一步。
android OpenGLES开发
a ndroid OpenGLES开发第一课绘制简单的Polygon1)首先你要定义自己的Polygon类,当然你一可以直接在Renderer的子类中直接绘制,为了更加符合面向对象,还是自定义一个Polygon类更好,这样代码更加清晰,Polygon 类中主要有Polygon的顶点坐标,和绘制Polygon对象的draw方法,例如下面的代码:public class Polygon{/***The buffer holding the Polygon‘s vertices**保存Polygon对象顶点坐标的FloatBuffer*/private FloatBuffer vertexBuffer;/***The initial vertex definition**保存Polygon对象顶点坐标的的float数组*/private float vertices[]={0.0f,1.0f,0.0f,//Top-1.0f,-1.0f,0.0f,//Bottom Left1.0f,-1.0f,0.0f//Bottom Right};/***The Triangle constructor.**Initiate the buffers.*/public Polygon(){//this is the common method to initiate the FloatBuffer//下面是一种常用的初始化FloatBuffer的方法,本人还见到过一种方法,如下://vertexBuffer=FloatBuffer.wrap(vertices)//但是如果用这种方法在运行的时候会报错,指出你的FloatBuffer没有序列化,//不明白原因,如有明白的高手帮解释一下,不胜感激ByteBuffer byteBuf=ByteBuffer.allocateDirect(vertices.length*4);byteBuf.order(ByteOrder.nativeOrder());vertexBuffer=byteBuf.asFloatBuffer();vertexBuffer.put(vertices);vertexBuffer.position(0);}/***The object own drawing function.Called from the renderer to redraw this*instance with possible changes in values.**@param gl*-The GL context*/public void draw(GL10gl){//这就是Polygon被绘制的方法,下面都是一些在draw方法中经常用到的简单的设置,//在此不一一解释了//Set the face rotationgl.glFrontFace(GL10.GL_CW);//Point to our vertex buffergl.glVertexPointer(3,GL10.GL_FLOAT,0,vertexBuffer);//Enable vertex buffergl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//Draw the vertices as triangle stripgl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,vertices.length/3);//Disable the client state before leavinggl.glDisableClientState(GL10.GL_VERTEX_ARRAY);}}2)下面就是Renderer子类,它就是一个OpenGL渲染器,就是真正绘制3D图形的地方,主要是重写三个方法(三个方法将在下面一一标出),设置一些属性,来完成我们想要达到的效果,代码如下:public class Myrenderer implements Renderer{Polygon polygon;public Myrenderer(){polygon=new Polygon();}/***The Surface is created/init()**这个方法是当surface创建时调用的方法,主要是设置一些属性*/public void onSurfaceCreated(GL10gl,EGLConfig config){gl.glShadeModel(GL10.GL_SMOOTH);//Enable Smooth Shadinggl.glClearColor(0.0f,0.0f,0.0f,0.5f);//Black Backgroundgl.glClearDepthf(1.0f);//Depth Buffer Setupgl.glEnable(GL10.GL_DEPTH_TEST);//Enables Depth Testinggl.glDepthFunc(GL10.GL_LEQUAL);//The Type Of Depth Testing To Do//Really Nice Perspective Calculationsgl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_NICEST);}/***Here we do our drawing*/public void onDrawFrame(GL10gl){//这个方法就是真正绘制3D图形的方法,系统会根据机器的性能在固定的时间间隔自动调用这个方法//这里通过设置gl的属性,和我们定义的Polygon类的顶点坐标来绘制我们想要达到的效果//Clear Screen And Depth Buffergl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);gl.glLoadIdentity();//Reset The Current Modelview Matrixgl.glTranslatef(0.0f,-1.2f,-6.0f);//Move down1.2Unit And Into The//Screen6.0polygon.draw(gl);//Draw the triangle}/***If the surface changes,reset the view*/public void onSurfaceChanged(GL10gl,int width,int height){//这个方法是当surface改变时调用的方法,也是设置一些gl的属性,//大体的设置没有太大变化,所以这基本上是一个通用的写法if(height==0){//Prevent A Divide By Zero Byheight=1;//Making Height Equal One}gl.glViewport(0,0,width,height);//Reset The Current Viewportgl.glMatrixMode(GL10.GL_PROJECTION);//Select The Projection Matrixgl.glLoadIdentity();//Reset The Projection Matrix//Calculate The Aspect Ratio Of The WindowGLU.gluPerspective(gl,45.0f,(float)width/(float)height,0.1f,100.0f);gl.glMatrixMode(GL10.GL_MODELVIEW);//Select The Modelview Matrixgl.glLoadIdentity();//Reset The Modelview Matrix}}3)最后就是把我们的GLSurfaceView通过activity的setContentView()方法加载到屏幕上,代码如下:public class TestActivity extends Activity{/**The OpenGL View*/private GLSurfaceView glSurface;/***Initiate the OpenGL View and set our own Renderer*/@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);//Create an Instance with this ActivityglSurface=new GLSurfaceView(this);//Set our own RendererglSurface.setRenderer(new Myrenderer());//Set the GLSurface as View to this ActivitysetContentView(glSurface);}/***Remember to resume the glSurface*/@Overrideprotected void onResume(){super.onResume();glSurface.onResume();}/***Also pause the glSurface*/@Overrideprotected void onPause(){super.onPause();glSurface.onPause();}}希望给刚刚入门的同学一些帮助,也希望和高手们交流一下经验。
android opengles 开发
Android OpenGL ES(一):关于OpenGL ES在学习Android OpenGL ES开发之前,你必须具备Java 语言开发经验和一些Android开发的基本知识,但并不需要有图形开发的经验,本教程也会涉及到一些基本的线性几何知识,如矢量,矩阵运算等。
此外Android SDK 中有关OpenGL ES API的开发文档▪android.opengl▪javax.microedition.khronos.egl▪javax.microedition.khronos.opengles▪java.nio注:上述Android 文档基本为空,可以参见JSR239 的文档,比较详细。
和OpenGL ES Specification 都是学习时常用到的参考资料。
什么是OpenGL ES?▪OpenGL ES (为OpenGL for Embedded System的缩写)为适用于嵌入式系统的一个免费二维和三维图形库。
▪为桌面版本OpenGL 的一个子集。
▪OpenGL ES 定义了一个在移动平台上能够支持OpenGL最基本功能的精简标准,以适应如手机,PDA或其它消费者移动终端的显示系统。
▪Khronos Group 定义和管理了OpenGL ES标准。
OpenGL 与OpenGL ES的关系OpenGL ES 是基于桌面版本OpenGL 的,下图显示了OpenGL 和OpenGL ES 之间的关系图▪OpenGL ES 1.0 基于OpenGL 1.3 ,在2003年发布▪OpenGL ES 1.1 基于OpenGL 1.5 , 在2004年发布▪OpenGL ES 2.0 基于OpenGL2.0, 在2007年发布▪OpenGL 2.0 向下兼容OpenGL 1.5 而OpenGL ES 2.0 和OpenGL ES1.x 不兼容,是两种完全不同的实现。
OpenGL ES ProfilesOpenGL ES 1.x 支持两种Profile以支持不同类型的嵌入设备。
8 Android 3D游戏开发-OpenGL应用
gl.glDrawElements(GL10.GL_TRIANGLES, 6,GL10.GL_UNSIGNED_SHORT,myIndexB uffer);
示例
Example3D02
颜色
单调着色
gl.glColor4f(1.0f, 0, 0, 0.5f);
平滑着色
开启颜色渲染功能
设置颜色
gl.glColorPointer(4, GL10.GL_FIXED, 0, myColorBuffer);
使用完之后关闭颜色
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
颜色
关于颜色取值:int one=0x10000;//65536
params:一维四元数组,R,G,B,A值 offset:数组偏移量,一般设置为0
示例:Example3D08
自发光
GL_EMISSION
自发光使材质看上去具有特定的颜色,可以使物体漂 亮地发光 自发光并不是真正在发光,其周边物体颜色不会受到 影响 将自发光物体和同一位置处的实际光源结合起来,可 以实现自发光物体影响到其他物体的效果。
示例:Example3D07
************************************
材质
设置材质:设置对于环境光、散射光、镜面光的反射能力 gl. glMaterialfv (int face, int pname, float[] params, int offset)
int[] tmp_tex = new int[1];//尽管只有一个纹理,但 要使用一个元素的数组 //glGenTextures(申请个数,存放数组,偏移值) gl.glGenTextures(1, tmp_tex, 0); //向系统申请可用 的,用于标示纹理的ID int texture = tmp_tex[0];
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android 3D 游戏开发教程(Open Graphics Library)目前最全的Android OpenGL文档这几篇Android 3D游戏开发的文章原文出自一位德国人Martin 在写的文章,由lixinso翻译为中文。
拷贝于博客:/lixinso/archive/2010/01/30/5272927.aspx第一部分首先介绍OpenGL相关的术语,并引导你开始3D开发的第一步。
这个关于3D游戏的系列的叫做V ortex .这个教程主要focus在3D编程上,其他的东西比如菜单和程序生命周期虽然是代码的一部分,但是在这里不会被提到。
首先开始介绍OpenGL的术语。
顶点V ertex顶点是3D空间中的一个点,也是许多对象的基础元素。
在OpenGL中你可以生命少至二维坐标(X,Y),多至四维(X,Y,Z,W). w轴是可选的,默认的值是1.0. Z轴也是可选的,默认为0. 在这个系列中,我们将要用到3个主要的坐标X,Y,Z,因为W一般都是被用来作为占位符。
vertex的复数是vertices(这对非英语母语的人来说比较重要,因为这容易产生歧义)。
所有的对象都是用vertices作为它们的点,因为点就是vertex。
三角形Triangle三角形需要三个点才能创建。
因此在OpenGL中,我们使用3个顶点来创建一个三角形。
多边形Polygon多边形是至少有3个连接着的点组成的一个对象。
三角形也是一个多边形。
图元Primitives一个Primitive是一个三维的对象,使用三角形或者多边形创建。
形象的说,一个有50000个顶点的非常精细的模型是一个Primitive,同样一个只有500个顶点的低模也叫做一个Primitive。
现在我们可以开始变成了。
创建一个工程交V ortex,activity也是这个名字。
我们的工程应该大概是这个样子的:package com.droidnova.android.games.vortex;import android.app.Activity;import android.os.Bundle;public class V ortex extends Activity {private static final String LOG_TAG = V ortex.class.getSimpleName();private V ortexV iew _vortexV iew;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);_vortexV iew = new V ortexView(this);setContentView(_vortexView);}}如上图所示,我们已经添加了View。
让我们看一下V ortexView类。
package com.droidnova.android.games.vortex;import android.content.Context;import android.opengl.GLSurfaceView;public class V ortexView extends GLSurfaceV iew {private static final String LOG_TAG = V ortexV iew.class.getSimpleName();private V ortexRenderer _renderer;public V ortexView(Context context) {super(context);_renderer = new V ortexRenderer();setRenderer(_renderer);}}如上所示,我们继承了GLSurfaceView是因为它会帮助我们画3D图像。
接下来看V ortexRenderer类。
一个Renderer包含画一帧所必需的所有东西。
引用自这儿references。
Renderer负责OpenGL call来render一个帧。
来看一下这个类:package com.droidnova.android.games.vortex;import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.opengles.GL10;import android.opengl.GLSurfaceView;public class V ortexRenderer implements GLSurfaceV iew.Renderer {private static final String LOG_TAG = V ortexRenderer.class.getSimpleName();private float _red = 0.9f;private float _green = 0.2f;private float _blue = 0.2f;@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) {// Do nothing special.}@Overridepublic void onSurfaceChanged(GL10 gl, int w, int h) {gl.glViewport(0, 0, w, h);}@Overridepublic void onDrawFrame(GL10 gl) {// define the color we want to be displayed as the "clipping wall"gl.glClearColor(_red, _green, _blue, 1.0f);// clear the color buffer to show the ClearColor we called above...gl.glClear(GL10.GL_COLOR_BUFFER_BIT);}}好,我们做了什么?首先我们实现了GLSurfaceView.Renderer这个接口,主要是实现3个方法:onSurfaceCreated(), onSurfaceChanged() 和onDrawFrame()。
这些方法很容易理解,第一个在surface创建以后调用,第二个是在surface发生改变以后调用,例如从竖屏切换到横屏的时候,最后一个方法是当任何时候调用一个画图方法的时候。
从11行到13行,我们用浮点数来定义RGB颜色系统中的每一个颜色。
在28行,我们通过glClearColor()方法为底色定义了颜色。
底色是在我们能看到的所有东西的后面,所以所有在底色后面的东西都是不可见的。
可以想象这种东西为浓雾,挡住了所有的东西。
然后我们将要为之设置距离来show一下它怎么用的。
那时候你就一定会明白它是怎么存在的了。
为了让颜色变化可见,我们必须调用glClear()以及颜色缓冲的Mask来清空buffer,然后为我们的底色使用新的底色。
为了能看到它在起作用,我们这里为MotionEvent创建一个response,使用它来改变颜色。
首先在V ortexRenderer中来创建一个设置颜色的函数。
public void setColor(float r, float g, float b) {_red = r;_green = g;_blue = b;}下面是V ortexView类中创建的方法来处理MotionEvent。
public boolean onTouchEvent(final MotionEvent event) {queueEvent(new Runnable() {public void run() {_renderer.setColor(event.getX() / getWidth(), event.getY() / getHeight(), 1.0f);}});return true;}复制代码我们创建了一个匿名的Runnable对象,这里的run()方法调用renderer中的setColor方法。
这有会根据MotionEvent坐标做一些小的计算。
现在我们已经有了一个小小的程序来使用OpenGl来改变我们的背景色了。
在德语中我们叫这种小case为“Mit Kanonen auf Spatzen schießen”,翻译过来应该是“你在车轮上打死了一只苍蝇”。
这说的恰到好处,这只是一个最最最小的例子,要学习OpenGL,你现在要准备更多更多的东西。
这部分最后提一下OpenGL的文档documentation for OpenGL 。
这个东西虽然可用想不高,但是它最少是一个文档。
这里是几个截图:------------------------------------------------------------------这个系列的第二部分是关于如何添加一个三角形并可以旋转它。
第一件事情是初始化需要显示的三角形。
我们来在V ortexRenderer类中添加一个方法initTriangle()。
// new object variables we need// a raw buffer to hold indicesprivate ShortBuffer _indexBuffer;// a raw buffer to hold the verticesprivate FloatBuffer _vertexBuffer;private short[] _indicesArray = {0, 1, 2};private int _nrOfV ertices = 3;// code snippedprivate void initTriangle() {// float has 4 bytesByteBuffer vbb = ByteBuffer.allocateDirect(_nrOfV ertices * 3 * 4);vbb.order(ByteOrder.nativeOrder());_vertexBuffer = vbb.asFloatBuffer();// short has 2 bytesByteBuffer ibb = ByteBuffer.allocateDirect(_nrOfV ertices * 2);ibb.order(ByteOrder.nativeOrder());_indexBuffer = ibb.asShortBuffer();float[] coords = {-0.5f, -0.5f, 0f, // (x1, y1, z1)0.5f, -0.5f, 0f, // (x2, y2, z2)0f, 0.5f, 0f // (x3, y3, z3)};_vertexBuffer.put(coords);_indexBuffer.put(_indicesArray);_vertexBuffer.position(0);_indexBuffer.position(0);}让我们从新的对象变量开始. _vertexBuffer为我们的三角形保存坐标._indexBuffer保存索引. _nrOfV ertices变量定义需要多少个顶点.对于一个三角形来说,一共需要三个顶点.这个方法首先为这里两个buffer分配必须的内存(14-22行). 接下来我们定义一些坐标(24-28行) 后面的注释对用途给予了说明.在30行,我们将coords数组填充给_vertexBuffer . 同样在31行将indices数组填充给_indexBuffer 。