在Android应用中使用OpenGL

摘要:
Android为OpenGLES支持提供了GLSurfaceView组件,用于显示3D图形。综上所述,在Android中使用OpenGLES需要三个步骤:1.创建GLSurfaceView组件并使用Activity显示GLSurfaceView组件。GlDisable:此方法用于禁用OpenGLES的一个方面。上面示例中的代码用于关闭防抖,这可以提高性能。ClearColor:此方法设置OpenGLES“透明屏幕”使用的颜色,四个参数分别设置红、绿、蓝和透明度值;0是最小值,1是最大值。GlShadeMode:此方法用于设置OpenGLES的阴影模式。这里,它被设置为阴影平滑模式。

Android为OpenGL  ES支持提供了GLSurfaceView组件,这个组件用于显示3D图形。GLSurfaceView本身并不提供绘制3D图形的功能,而是由GLSurfaceView.Renderer来完成了SurfaceView中3D图形的绘制。

归纳起来,在Android中使用OpenGL  ES需要三个步骤:

1、创建GLSurfaceView组件,使用Activity来显示GLSurfaceView组件。

2、为GLSurfaceView组件创建GLSurfaceView.Renderer实例,实现GLSurfaceView.Renderer类时需要实现该接口里的三个方法:

  abstract  void  onDrawFrame(GL10  gl):Renderer对象调用该方法绘制GLSurfaceView的当前帧。

  abstract  void  onSurfaceChanged(GL10  gl , int  width  ,int  height):当GLSurfaceView的大小改变时回调该方法。

  abstract  void  onSurfaceCreated(GL10  gl  ,  EGLConfig  config):当GLSurfaceView被创建时回调该方法。

3、调用GLSurfaceView组件的setRenderer()方法指定Renderer对象,该Renderer对象将会完成GLSurfaceView里3D图像的绘制。

从上面的介绍不难看出,实际上绘制3D图形的难点不是如何使用GLSurfaceView组件,而是如何实现Renderer类。实现Renderer类时需要实现三个方法,这三个方法都有一个GL10形参,它就代表了GLOpen  ES的“绘制画笔”,我们可以把它想象成Swing  2D绘图中的Graphics,也可以想象成Android  2D绘图中的Canvas组件-----当我们希望Renderer绘制3D图形时,实际上是调用GL10的方法来进行绘制的。

当SurfaceView被创建时,系统会回调Renderer对象的onSurfaceCreated()方法,该方法将可以对OpenGL  ES执行一些无须任何改变的初始化,例如:

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  // 关闭抗抖动
  gl.glDisable(GL10.GL_DITHER);
  //设置系统对透视进行修正
  gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
  gl.glClearColor(0, 0, 0, 0);
  //设置阴影平滑模式
  gl.glShadeModel(GL10.GL_SMOOTH);
  //启用深度测试
  gl.glEnable(GL10.GL_DEPTH_TEST);
  //设置深度测试的类型
  gl.glDepthFunc(GL10.GL_LEQUAL);
}

GL10就是OpenGL  ES的绘图接口,但实际上他也是GL11的实例,可通过(gl  Instansof  GL11)判断它是否为GL11接口的实例。

glDisable(int  cap):该方法用于禁用OpenGL  ES某个方面的特性,上例中代码用于关闭抗抖性,这样可以提高性能。

glHint(int  target  , int mode):该方法用于对OpenGL  ES某方法进行修正。

clearColor(float  red  ,  float green  ,  float  blue  , float  alpha):该方法设置OpenGL  ES“清屏”所用的颜色,四个参数分别设置红、绿、蓝、透明度值;0为最小值,1为最大值。例如设置gl.glClearColor(0 ,  0 , 0 , 0):就是用黑色“清屏”。

glShadeMode(int  mode):该方法用于设置OpenGL  ES的阴影模式,此处设为阴影平滑模式。

glEnable(int  cap):该方法与glDisable(int  cap)方法相对,用于启用OpenGL  ES某方面的特性,此处用于启动OpenGL  ES的深度测试,所谓“深度测试”,就是让OpenGL  ES负责跟踪每个物体在Z轴上的深度,这样就可避免后面的物体遮挡前面的物体。

当SurfaceView组件的大小发生改变时,系统会回调Renderer对象的onSurfaceChanged()方法,因此该方法通常用于初始化3D场景。例如如下初始化代码:

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
  // 设置3D视窗的大小及位置
  gl.glViewport(0, 0, width, height);
  //将当前矩阵模式设为投影矩阵
  gl.glMatrixMode(GL10.GL_PROJECTION);
  //初始化单位矩阵
  gl.glLoadIdentity();
  //计算透视视窗的宽度、高度比
  float ratio = (float)width/height;
  //调用此方法设置透视视窗的空间大小
  gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
}

上面的方法中用到了GL10的一些初始化方法,此处做简要说明:

glViewport(int  x , int  y  ,  int  width ,  int  height):设置3D视窗的位置与大小。其中前两个参数指定该视窗的位置,后两个参数指定该视窗的宽、高。

glMatrixMode(int  mode):设置视图的矩阵模型。通常可接受GL10.GL_PROJECTION、GL10.GL_MODEVIEW两个常量值。

  当调用glMatrixMode(GL10.GL_PROJECTION):代码后,指定将屏幕视为透视图(要想看到逼真的三维物体,这是必要的),这意味着越远的东西看起来越小;当调用glMatrixMode(GL10.GL_MODEVIEW):代码后,即将当前矩阵模式设为模型视图矩阵,这意味着任何新的变换都会影响该矩阵中的所有物体。

glLoadIdentity():相当于reset()方法,用于初始化单位矩阵。

glFrustumf(float  left  , float  right , float  bottom , float  top , float  zNear  ,  float  zFar):用于设置透视投影的空间大小。前路两个参数用于设置X轴上的最小坐标值、最大坐标值;中间两个参数用于设置Y轴上的最小坐标值、最大坐标值;后面两个参数用于设置Z轴上所能绘制的场景的深度的最小值、最大值。

注:三维坐标系统与二维坐标系统并不相同,而二维坐标系统上的坐标值通常就直接使用系统的像素数量;但三维坐标系统的坐标值则取决于glFrustumf()方法的设置。

GLSurfaceView上的所有3D图形都是有Renderer的onDrawFrame(GL10  gl)方法绘制出来的,重写该方法时就要把所有3D图形都绘制出来,该方法通常以如下形式开始:

@Override
public void onDrawFrame(GL10 gl) {
  // 清除屏幕缓存和深度缓存
  gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
}

免责声明:文章转载自《在Android应用中使用OpenGL》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Openssh存在弱加密算法解决google guava工具包下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android OpenGL ES 入门系列(一) --- 了解OpenGL ES的前世今生

  转载请注明出处 本文出自Hansion的博客 OpenGL ES (OpenGL for Embedded Systems)         是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,主要用来开发3D图形应用 Android支持以下几个版本的OpenGL ES API:         OpenGL ES...

[原] OpenGL ES 学习笔记 (一)

1.OpenGL ES 的坐标系在屏幕上的分布 OpenGL ES 的坐标系{x, y, z} 通过图片的三维坐标系可以知道: - 它是一个三维坐标系 {x, y, z} - 三维坐标中心在正方体的几何中心 {0, 0, 0} - 整个坐标系是 [0, 1] 的点,也就是说 OpenGL 中只支持 0 ~ 1 的点 (这里所讲的 0 和 1 ,最好理...

Android OpenGL ES(七)基本几何图形定义 .

在前面Android OpenGL ES(六):创建实例应用OpenGLDemos程序框架我们创建了示例程序的基本框架,并提供了一个“Hello World”示例,将屏幕显示为红色。 本例介绍OpenGL ES 3D图形库支持的几种基本几何图形,通常二维图形库可以绘制点,线,多边形,圆弧,路径等等。OpenGL ES 支持绘制的基本几何图形分为三类:点,线...

OpenGL教程一

引自:https://blog.csdn.net/u013654125/article/details/73613644 GLEW, GLFW和GLM介绍 现在你有了工程,就让我们开始介绍下工程所用到的开源库和为啥需要这些。 The OpenGL Extension Wrangler (GLEW)是用来访问OpenGL 3.2 API函数的。不幸的是你不能...

OpenGL的GLUT事件处理(Event Processing)窗口管理(Window Management)函数[转]

GLUT事件处理(Event Processing)窗口管理(Window Management)函数 void glutMainLoop(void)      让glut程序进入事件循环。在一个glut程序中最多只能调用一次。一旦调用,会直到程序结束才返回。 int glutCreateWindow(char* name);     产生一个顶层的窗口。...

用OpenGL进行曲线、曲面的绘制

实验目的 理解Bezier曲线、曲面绘制的基本原理;理解OpenGL中一维、二维插值求值器的用法。 掌握OpenGL中曲线、曲面绘图的方法,对比不同参数下的绘图效果差异; 代码1:用四个控制点绘制一条三次Bezier曲线 Github地址 #include "stdafx.h" #include <stdlib.h> #incl...