OpenGL已经成了3D的一个"标准" 因为它能跨平台,接口也比较丰富,几乎大部分的手机3D游戏都和OpenGL有关系。

当然还有微软有direct X 但只能在微软平台上使用。

OpenGL底层是c/c++实现,JAVA中使用都是用封装好的类库。Android提供了以下几个接口包 可使用,基本能达到3D技术的要求。

Android平台用OpenGL ES 这个子集来处理图像,现在OpenGL ES基本用2.0的了,很少再用1.0的,3.0还未流行起来。

首先编写判断Android设备是否支持OpenGL 2.0.

GLHelper.java加入一个判断是否支持2.0版本的代码方法。

public static boolean enableOpenGL2(Activity act) {final ActivityManager mg = (ActivityManager) act.getSystemService(Context.ACTIVITY_SERVICE);ConfigurationInfo configuration = mg.getDeviceConfigurationInfo();boolean b = configuration.reqGlEsVersion >= 0x20000);return b;}

我们需要扩展 android.opengl.GLSurfaceView 这个类,让图像绘制在SurfaceView上面,看看源码发现这个类其实是扩展了SurfaceView做了写封装。

public class MyOpenGLView extends GLSurfaceView { //这个类就先空着,这一次没有太多的代码public MyOpenGLView(Context context) {super(context);}public MyOpenGLView(Context context, AttributeSet attrs) {super(context, attrs);}}

我们把处理的各种方法封装一下。

public class GLData {public GLData() {}public static float[] singelTriangles = { //定义了2个三角形,组成了一个正方形,因为openGL ES只能是点,线和三角形-0.3f, -0.3f, 0.3f, 0.3f, -0.3f, 0.3f, -0.3f, -0.3f,0.3f, -0.3f, 0.3f, 0.3f};}

OpenGL ES在Android的坐标系是 [-1,1]的区间内

编写2个简单的顶点着色器和片段做色器。

public class GLScript {public GLScript() {}public static final String vertex1 = "attribute vec4 mPosition;\n" +"void main()\n" +"{\n" +"gl_Position=mPosition;\n " +"}\n";public static final String fragment1 = "precision mediump float;\n" +"uniform vec4 mColor;\n" +"void main(){ gl_FragColor=mColor;\n}";}
vec4 mPosition 这个表示定义了一个4分量(x,y,z,w)的顶点,然后付给gl_Position 内置的变量中,OpenGL会编译并且自动处理。
vec4 mColor 这个表示定义了一个颜色分量RGBA,最后一个是透明度,即是 红绿蓝.

脚本语言是OpenGL ES的核心,很多的渲染效果都需要脚本处理。

GLHelper.java添加编译脚本的代码方法.

 public static int compileScript(int type, String script){int objID  = GLES20.glCreateShader(type); //创建一个着色器对象,TYPE表示顶点着色器和片段着色器if (objID == 0) { //0表示有错误return 0;}GLES20.glShaderSource(objID, script); //把脚本代码传给OpenGL 引擎GLES20.glCompileShader(objID); //开始编译int[] status = new int[1];GLES20.glGetShaderiv(objID, GLES20.GL_COMPILE_STATUS, status, 0); //看看编译结果是否有错误。Log.d("OPENGL","compileScript status info:" + GLES20.glGetShaderInfoLog(objID));if (status[0] == 0) {GLES20.glDeleteShader(objID);//有错误我们删除这个对象。Log.e("OPENGL", "Error Compile Script:" + script);return 0;}return objID;}

如果编译成功我们开始关联OpenGL ES程序。

 public static int linkGL(){int programId = GLES20.glCreateProgram();//创建一个程序if (programId == 0) {Log.e("OPENGL", "Error Create Link Program");return 0;}return programId;}public static int linkAttach(int vertexsharder,int fragmentsharder){int programId = linkGL();GLES20.glAttachShader(programId, vertexsharder); //和着色器进行关联GLES20.glAttachShader(programId, fragmentsharder);//和着色器进行关联GLES20.glLinkProgram(programId); //把program链接起来int status[] = new int[1];GLES20.glGetProgramiv(programId, GLES20.GL_LINK_STATUS, status, 0); //这地方一样是检查是否有错误发生。Log.d("OPENGL","linkAttach link status is " + GLES20.glGetProgramInfoLog(programId));if (status[0] == 0) {Log.e("OPENGL","link status is error.");GLES20.glDeleteProgram(programId);return 0;}return programId;}

最后我们验证程序是否有错误

 public static boolean checkProgram(int programId){GLES20.glValidateProgram(programId);int status[] = new int[1];GLES20.glGetProgramiv(programId,GLES20.GL_VALIDATE_STATUS, status,0);if (status[0] == 0) {Log.e("OPENGL","program is error");return false;}return true;}

以上代码都写在 GLHelper.java中,

我们把代码加入到渲染类中Renderer

渲染类

public class MyOpenGLRenderer implements Renderer {public static FloatBuffer verDataBuffer;int colorLocation ;int positionLocation ;public MyOpenGLRenderer() {// 申请直接内存空间,并使用native字节序列verDataBuffer = ByteBuffer.allocateDirect(4 * GLData.singelTriangles.length).order(ByteOrder.nativeOrder()).asFloatBuffer();verDataBuffer.put(GLData.singelTriangles);  //这是一个正方形,等会贴代码。}@Overridepublic void onDrawFrame(GL10 arg0) { //这个方法会不断的重绘GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);GLES20.glUniform4f(colorLocation, 0f, 0f, 0F, 0f); //这里是黑色,颜色将传入给<span style="font-family: Arial, Helvetica, sans-serif;">colorLocation</span>GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 6);//画三角形,有6个顶点 所以从0,6开始}@Overridepublic void onSurfaceChanged(GL10 arg0, int w, int h) {GLES20.glViewport(0, 0, w, h);}@Overridepublic void onSurfaceCreated(GL10 arg0, EGLConfig arg1) {GLES20.glClearColor(1F, 1F, 1F, 0.0F); //下面的代码都是组织起来用我们编写的GLHelper类.int vertexsharder = GLHelper.compileScript(GLES20.GL_VERTEX_SHADER, GLScript.vertex1);int fragmentsharder = GLHelper.compileScript(GLES20.GL_FRAGMENT_SHADER, GLScript.fragment1);int programId = GLHelper.linkAttach(vertexsharder, fragmentsharder);boolean isOK = GLHelper.checkProgram(programId);if (isOK) {Log.d("","start draw..............");GLES20.glUseProgram(programId); //我们开始使用这个程序colorLocation = GLES20.glGetUniformLocation(programId, "mColor");//获得变量位置,可以理解为内存地址,OpenGL 将为在这个地址中取数据positionLocation = GLES20.glGetAttribLocation(programId, "mPosition");verDataBuffer.position(0);//数据开始端读取GLES20.glVertexAttribPointer(positionLocation, 2, GLES20.GL_FLOAT, false, 0, verDataBuffer);//这个地方把顶点数据与变量关联起来GLES20.glEnableVertexAttribArray(positionLocation);//这地方使得能够使用顶点数组}}
}

最后Activity部分代码.

 private MyOpenGLView gLView;private boolean openGLEnable;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (GLHelper.enableOpenGL2(this)) {openGLEnable = true;}Log.d("","OpenGL is Enable:" + openGLEnable);gLView = new MyOpenGLView(this);gLView.setEGLContextClientVersion(2);//可以使用OpenGL ES 2.0gLView.setRenderer(new MyOpenGLRenderer());setContentView(gLView);}

运行结果很简单就是中间一个正方形。

OpenGL ES入门相对还是比较复杂的,因为函数的调用和平时用的JAVA,, C++ 库都不太一样

3D的东西复杂不仅仅是多了一个坐标Z,还有很多的渲染技术。

工程结构:

Android OpenGL ES 应用(一)相关推荐

  1. android自定义美颜相机完整程序,Android OpenGL ES从入门到进阶(一)—— 五分钟开发一款美颜相机...

    源码链接:https://github.com/smzhldr/AGLFramework 一.前言 商店里有数十款的美颜相机类产品,其实现原理基本上都是以OpenGL ES为核心的特效处理,大神可以忽 ...

  2. Android OpenGL ES 开发教程(20):颜色Color

    OpenGL ES 支持的颜色格式为RGBA模式(红,绿,蓝,透明度).颜色的定义通常使用Hex格式0xFF00FF 或十进制格式(255,0,255), 在OpenGL 中却是使用0-1之间的浮点数 ...

  3. OpenGl文章 Android OpenGL ES 简明开发教程

    Android OpenGL ES 简明开发教程 分类:android学习笔记2011-12-14 15:04375人阅读评论(0)收藏举报 ApiDemos 的Graphics示例中含有OpenGL ...

  4. Android OpenGL ES 开发教程(16):Viewing和Modeling(MODELVIEW) 变换

    Viewing和Modeling 变换关系紧密,对应到相机拍照为放置三角架和调整被拍物体位置及角度,通常将这两个变换使用一个modelview 变换矩阵来定义.对于同一个坐标变换,可以使用不同的方法来 ...

  5. Android OpenGL ES(六)创建实例应用OpenGLDemos程序框架 .

    有了前面关于Android OpenGL ES的介绍,可以开始创建示例程序OpenGLDemos. 使用Eclipse 创建一个Android项目 Project Name: OpenGLDemos ...

  6. Android OpenGL ES视频渲染(一)GLSurfaceView

    相关文章:Android OpenGL ES视频渲染(二)EGL+OpenGL Android中视频渲染有几种方式,之前的文章使用的是nativewindow(包括softwareRender).今天 ...

  7. Android OpenGL ES 学习(十一) –渲染YUV视频以及视频抖音特效

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  8. Android OpenGL ES 从入门到精通系统性学习教程

    1 为什么要写这个教程 目前这个 OpenGL ES 极简教程的更新暂时告一段落,在此之前,很荣幸获得了阮一峰老师的推荐. 因为在工作中频繁使用 OpenGL ES 做一些特效.滤镜之类的效果,加上平 ...

  9. Android OpenGL ES 画出三棱锥

    如今VR这么火,感觉有必要学学OpenGL.什么是OpenGL ES ,OpenGL ES (OpenGL for Embedded System ) 为适用于嵌入式系统的一个免费二维和三维图形库.O ...

  10. Android OpenGL ES 学习(二) -- 图形渲染管线和GLSL

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

最新文章

  1. Python之父发文,将重构现有核心解析器
  2. 如何自己实现一套EasyNVR这样的无插件流媒体服务器
  3. python 列表写入excel_Python将MySQL表数据写入excel
  4. MySQL中的表压缩功能
  5. android 百度map 一个layout加载多个mapview,android 百度地图API 使用Marker和InfoWindow
  6. C++项目中编译部分C的代码
  7. SpringCloud集成Seata精简入门教程
  8. Java经典设计模式-创建型模式-抽象工厂模式(Abstract Factory)
  9. 5.4 Components -- Wrapping Content in A Component(在组件中包裹内容)
  10. 知识图谱-命名实体-关系-免费标注工具-快速打标签-Python3
  11. 深度学习小笔记04-魏秀参《解析深度学习-卷积神经网络原理与视觉实践》
  12. linux系统及编程基础唐晓君,Linux-Shell编程之判断文件类型
  13. 教你怎样无需微云会员满速下载文件
  14. Java基础03:数据类型讲解
  15. ChatGPT指令大全(中文版)
  16. 有了这款 GitHub 开源神器,以后再也不怕找不到电影资源啦!
  17. 面向企业级的开源WebGIS解决方案--MapGuide(安装)
  18. 七年级计算机课计划,初中信息技术教学计划范文(通用5篇)
  19. 设置nv12的矩形边框
  20. 家用路由器AP模式设置

热门文章

  1. 保证充足的高质量睡眠
  2. 每日英语:China's Conflicted Consumers
  3. Result「?」 返回类型拼接
  4. 解决iphonex底部导航问题
  5. 建网站如何选择服务器
  6. c++_-nan(ind) NAN
  7. Elasticsearch语法知多少之Term query
  8. 浅谈大数据之足球盘口赔率水位分析的思路与神准预测技巧(一)
  9. 【Lua 教程系列第 4 篇】Lua 中的第一行代码 hello world
  10. 黑马程序员:IP地址:InetAddress类的介绍(无构造函数)