如何在Android上使用OpenGL ES 2.0绘制点

如何在Android上使用OpenGL ES 2.0绘制点,第1张

OpenGLES是一个让人崩溃的东西。在Andorid手机上做3D还就得用它。把我记的一些笔记分享在这里吧:AndroidOpenGLES简介20011-6-3Android系统使用OpenGL的标准接口来支持3D图形功能,android3D图形系统也分为java框架和本地代码两部分。本地代码主要实现的OpenGL接口的库,在Java框架层,javaxmicroeditionkhronosopengles是java标准的OpenGL包,androidopengl包提供了OpenGL系统和AndroidGUI系统之间的联系。Android的本地代码位于frameworks/base/opengl下,JNI代码位于frameworks/base/core/com_google_android_gles_jni_GLImplcpp和frameworks/base/core/com_google_android_gles_jni_EGLImplcpp,java类位于opengl/java/javax/microedition/khronos下本地测试代码位于frameworks/base/opengl/tests。包括angeles、fillrate等14个测试代码,这些代码都可以通过终端进行本地调用测试(模拟器中使用adbshell)。OpenGLES1x固定管线操作,支持glVertexPointer()等函数,不支持GLSL。头文件在ndk的GLES目录下,库文件是libGLESv1_CMso。OpenGLES2x可编程管线操作,不兼容1x,不支持固定管线操作,例如glVertexPointer()等函数。支持GLSL(还必须用这个来编程)。头文件在ndk的GLES2目录下,库文件是libGLESv2so。OpenGLES学习2011-6-30OpenGL定义了自己的数据类型。应该坚持使用这些OpenGL的数据类型,从而保证可移植性和效率。OpenGLES目前不支持64位数据类型。OpenGLES只支持三边形。OpenGLES只支持gl开头的函数,glu库都不支持。OpenGLES从OpenGL中删除的功能:1glBegin/glEnd2glArrayElement3显示列表4求值器5索引色模式6自定义裁剪平面7glRect8图像处理(这个一般显卡也没有,FireGL/Quadro显卡有)9反馈缓冲10选择缓冲11累积缓冲12边界标志13glPolygonMode14GL_QUADS,GL_QUAD_STRIP,GL_POLYGON15glPushAttrib,glPopAttrib,glPushClientAttrib,glPopClientAttrib16TEXTURE_1D、TEXTURE_3D、TEXTURE_RECT、TEXTURE_CUBE_MAP17GL_COMBINE18自动纹理坐标生成19纹理边界20GL_CLAMP、GL_CLAMP_TO_BORDER21消失纹理代表22纹理LOD限定23纹理偏好限定24纹理自动压缩、解压缩25glDrawPixels,glPixelTransfer,glPixelZoom26glReadBuffer,glDrawBuffer,glCopyPixelsOpenGLES202011-10-920和11不兼容。-20使用的头文件是ndk的include目录下的GLES2目录,有gl2h,gl2exth,gl2platformh,而11使用的是GLES目录。-20使用的库文件是ndk的lib目录下的libGLESv2so,而11使用的是libGLESv1_CMso。-20中取消了很多11函数,例如glMatrixModel和glLoadIdentity等。OpenGL着色语言(GLSL――OpenGLShadingLanguage)-使用20,必须学此语言。因为很多11的函数都被取消了。san-angelesNDKOpenGLES11的例子程序2012-3-8SanAngeles,查维基百科,是一个虚构的未来概念城市,位于南加州。常在**中出现,来源自LosAngeles和SanDiego该程序的演示效果是,观察一个宏伟的城市,地面是镜面有建筑倒影,城市中有飞船飞过。前后有5、6个观察点,而且镜头在每个观察点不停的移动。这个例子,用NDK(C++)调用OpenGLES11来绘制了SanAngeles这个城市。基本上全部使用了NDK,Java程序只有1个。用vc2005演示一下,目的通过跟踪代码了解一些细节。方法是:-将jni下所有的h文件,以及democ,app-win32c复制出来,放在一个专门的目录下,然后改造成用OpenGL的而不是ES的。(或者干脆删除大段的绘制代码,保证编译通过)首先分析Java代码-DemoActivityjava,这是唯一的Java文件,它主要需要下列4个jni的接口:-privatestaticnativevoidnativeInit();//初始化-privatestaticnativevoidnativeResize(intw,inth);-privatestaticnativevoidnativeRender();//绘制1帧-privatestaticnativevoidnativeDone();其次分析C++代码app-androidc-首先,调用了importGLInit(),动态导入OpenGL的库。-其次,调用了appInit(),在内存中建立了平台无关的3D对象集合。建立方法是用一个数组,用类似画圆拔高的方式产生诸多三角形。-然后,在每个时钟周期中调用appRender(),细节是:-prepareFrame(width,height);//准备OpenGLES绘制框架。其实就是清空颜色和深度缓冲,重置投影和模型矩阵。-camTrack();//算好在当前时钟周期,镜头的位置、朝向及焦距等。然后调用gluLookAt来实现。-configureLightAndMaterial();//设置光源和材质-drawModels(-1);//先绘制倒影(其实就是将所有模型z轴倒过来画)-第一个循环,是画精致的物体-第二个循环,是画运动的物体-drawGroundPlane();//再绘制镜子一般的地面。在绘制前取消光照,打开混合,然后绘制。绘制后还原状态。-drawModels(1);//再绘制所有模型-drawFadeQuad();//最后绘制淡出框,用融合的方式画一个遮住整个视口的2D框,融合系数和时间相关。

OpenGLES是一个让人崩溃的东西。在Andorid手机上做3D还就得用它。把我记的一些笔记分享在这里吧:

Android OpenGL ES简介 20011-6-3

Android系统使用OpenGL的标准接口来支持3D图形功能,android 3D图形系统也分为java框架和本地代码两部分。

本地代码主要实现的OpenGL接口的库,在Java框架层,javaxmicroeditionkhronosopengles是java标准的OpenGL包,

androidopengl包提供了OpenGL系统和Android GUI系统之间的联系。

Android的本地代码位于frameworks/base/opengl下,

JNI代码位于frameworks/base/core/com_google_android_gles_jni_GLImplcpp和frameworks/base/core/com_google_android_gles_jni_EGLImplcpp,

java类位于opengl/java/javax/microedition/khronos下

本地测试代码位于frameworks/base/opengl/tests。包括angeles、fillrate等14个测试代码,这些代码都可以通过终端进行本地调用测试(模拟器中使用adb shell)。

OpenGL ES 1x

固定管线操作,支持glVertexPointer()等函数,不支持GLSL。头文件在ndk的GLES目录下,库文件是libGLESv1_CMso。

OpenGL ES 2x

可编程管线操作,不兼容1x,不支持固定管线操作,例如glVertexPointer()等函数。支持GLSL(还必须用这个来编程)。头文件在ndk的GLES2目录下,库文件是libGLESv2so。

OpenGL ES学习 2011-6-30

OpenGL定义了自己的数据类型。应该坚持使用这些OpenGL的数据类型,从而保证可移植性和效率。

OpenGL ES 目前不支持64位数据类型。

OpenGL ES 只支持三边形。

OpenGL ES 只支持gl开头的函数,glu库都不支持。

OpenGL ES 从 OpenGL中删除的功能:

1 glBegin/glEnd

2 glArrayElement

3 显示列表

4 求值器

5 索引色模式

6 自定义裁剪平面

7 glRect

8 图像处理(这个一般显卡也没有,FireGL/Quadro显卡有)

9 反馈缓冲

10 选择缓冲

11 累积缓冲

12 边界标志

13 glPolygonMode

14 GL_QUADS,GL_QUAD_STRIP,GL_POLYGON

15 glPushAttrib,glPopAttrib,glPushClientAttrib,glPopClientAttrib

16 TEXTURE_1D、TEXTURE_3D、TEXTURE_RECT、TEXTURE_CUBE_MAP

17 GL_COMBINE

18 自动纹理坐标生成

19 纹理边界

20 GL_CLAMP、GL_CLAMP_TO_BORDER

21 消失纹理代表

22 纹理LOD限定

23 纹理偏好限定

24 纹理自动压缩、解压缩

25 glDrawPixels,glPixelTransfer,glPixelZoom

26 glReadBuffer,glDrawBuffer,glCopyPixels

OpenGL ES 20 2011-10-9

20和11不兼容。

- 20使用的头文件是ndk的include目录下的GLES2目录,有gl2h,gl2exth,gl2platformh,而11使用的是GLES目录。

- 20使用的库文件是ndk的lib目录下的libGLESv2so,而11使用的是libGLESv1_CMso。

- 20中取消了很多11函数,例如glMatrixModel和glLoadIdentity等。

OpenGL着色语言(GLSL――OpenGL Shading Language)

- 使用20,必须学此语言。因为很多11的函数都被取消了。

san-angeles NDK OpenGL ES 11的例子程序 2012-3-8

San Angeles,查维基百科,是一个虚构的未来概念城市,位于南加州。常在**中出现,来源自Los Angeles和San Diego

该程序的演示效果是,观察一个宏伟的城市,地面是镜面有建筑倒影,城市中有飞船飞过。前后有5、6个观察点,而且镜头在每个观察点不停的移动。

这个例子,用NDK(C++)调用OpenGL ES 11来绘制了San Angeles这个城市。基本上全部使用了NDK,Java程序只有1个。

用vc2005演示一下,目的通过跟踪代码了解一些细节。方法是:

- 将jni下所有的h文件,以及democ,app-win32c复制出来,放在一个专门的目录下,然后改造成用OpenGL的而不是ES的。(或者干脆删除大段的绘制代码,保证编译通过)

首先分析Java代码

- DemoActivityjava,这是唯一的Java文件,它主要需要下列4个jni的接口:

- private static native void nativeInit(); // 初始化

- private static native void nativeResize(int w, int h);

- private static native void nativeRender(); // 绘制1帧

- private static native void nativeDone();

其次分析C++代码 app-androidc

- 首先,调用了importGLInit(),动态导入OpenGL的库。

- 其次,调用了 appInit(),在内存中建立了平台无关的3D对象集合。建立方法是用一个数组,用类似画圆拔高的方式产生诸多三角形。

- 然后,在每个时钟周期中调用appRender(),细节是:

- prepareFrame(width, height); // 准备OpenGL ES绘制框架。其实就是清空颜色和深度缓冲,重置投影和模型矩阵。

- camTrack(); // 算好在当前时钟周期,镜头的位置、朝向及焦距等。然后调用gluLookAt来实现。

- configureLightAndMaterial(); // 设置光源和材质

- drawModels(-1); // 先绘制倒影(其实就是将所有模型z轴倒过来画)

- 第一个循环,是画精致的物体

- 第二个循环,是画运动的物体

- drawGroundPlane(); // 再绘制镜子一般的地面。在绘制前取消光照,打开混合,然后绘制。绘制后还原状态。

- drawModels(1); // 再绘制所有模型

- drawFadeQuad(); // 最后绘制淡出框,用融合的方式画一个遮住整个视口的2D框,融合系数和时间相关。

欢迎分享,转载请注明来源:品搜搜测评网

原文地址:https://pinsoso.cn/shuma/997007.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-08-22
下一篇2023-08-22

随机推荐

  • 精华液一般怎么用 精华液的使用方法

    1、精华液的正确使用方法弄清楚了精华液的使用顺序后,美眉们应正确使用精华液来护理皮肤。首先需要清洁干净面部皮肤,然后取适量的精华液,涂抹的时候尽量避开眼睛,而后用手掌轻轻按压面部的T区和U区部位,由下往上的方式轻柔按压,以确保精华液充分被皮

    2024-04-15
    65600
  • 12岁女孩能使用妮维雅的丝柔美白爽肤水或丝润爽肤水吗?

    12岁女孩能使用妮维雅的丝柔美白爽肤水或丝润爽肤水吗?这是许多家长和女孩们关心的问题。我们需要知道妮维雅的丝柔美白爽肤水和丝润爽肤水都是针对成年人的产品。这些产品中可能含有一些成分,如酒精或其他化学物质,对于12岁的女孩来说可能会过于刺激。

    2024-04-15
    59900
  • 欧珀莱黑精灵精华怎么样?欧珀莱黑精灵精华使用方法

    欧珀莱黑精灵精华主打密实肌底,光润透亮,那么欧珀莱黑精灵精华怎么样?欧珀莱黑精灵精华使用方法是什么?面对这些问题,以下是针对欧珀莱黑精灵精华进行的全面分析,以了解欧珀莱黑精灵精华的其他性能,并帮助你解决更多的问题,有兴趣的朋友快来看看!

    2024-04-15
    67300
  • 几千块一罐的贵妇面霜跟几十块的面霜,到底有何差别?

    从几十块钱的妮维雅到上千块钱的海蓝之谜……同样是面霜,那为什么要花天价买贵的呢?平价面霜和贵妇面霜,区别在哪? 我们来看下LAMER和妮维雅的对比。 1 | 看品牌LA MER是雅诗兰黛集团旗下的一个贵妇高端品牌,它的修

    2024-04-15
    60300
  • 原液跟精华液有什么区别

    1、原液是单一成分、浓度更高、配方更精简,能够针对各种肌肤需要给肌肤更直接、快捷、更安全、更强效的保养,让肌肤在短时间内恢复最佳状态的美容产品。2、来源不同:原液的来源:原液虽然是一个新兴的护肤品类,但目前已经有丰富的品项。每一款原液,都添

    2024-04-15
    57200
  • 韩国的后和苏秘哪款好,whoo后和呼吸哪个更好

    韩国品牌的护肤品一直都是广受欢迎的,其中很多个品牌的反馈都比较不错,比较推荐的就是后和苏秘这两个品牌,那么韩国的后和苏秘哪款好whoo后和呼吸哪个更好呢?接下来就介绍下这两个品牌的护肤品,大家都可以了解一下。后和苏秘都是LG集团旗下的知名护

    2024-04-15
    49600
  • 补水喷雾和保湿精华液哪个好用?

    补水喷雾和保湿精华液都是最基础的护肤补水喷雾可以很好的补水保湿同时二次清洁洁肤,打开肌肤通道精华的浓度比补水喷雾的高,同时用完补水喷雾后再用精华,护肤可以达到翻倍的效果,所以精华比喷雾贵,喷雾做打底滋润肌肤,精华是更好的渗透到肌肤的深层,让

    2024-04-15
    44100

发表评论

登录后才能评论
保存