android studio | openGL es 3.0增强现实(AR)开发 (3) OpenGL es3.0基本知识介绍

1.OpenGL ES (为 OpenGL for Embedded System 的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库。OpenGL ES的历史版本信息

  • OpenGL ES 1.x 针对固定管线硬件
  • OpenGL ES 2.x 针对可编程管线硬件
  • OpenGL ES 1.0 以 OpenGL 1.3 规范为基础
  • OpenGL ES 2.0 以 OpenGL 2.0 规范为基础
  • OpenGL ES 3.0 于2012年公布,在OpenGL 3.x 和 4.x的基础上增加了许多新的功能。

3.0兼容2.0,但不兼容1.0

android studio | openGL es 3.0增强现实(AR)开发 (3) OpenGL es3.0基本知识介绍_第1张图片

2.GLSurfaceView

GLSurfaceView是Android应用程序中实现OpenGL画图的重要组成部分,是一个View容器,GLSurfaceView中封装了一个SurfaceView,其关系如下图中所示。

android studio | openGL es 3.0增强现实(AR)开发 (3) OpenGL es3.0基本知识介绍_第2张图片

3.Renderer

将GLSurfaceView比做画图的纸,Renderer是GLSurfaceView的内部静态接口,它就相当于在此GLSurfaceView上作画的笔。我们通过实现这个接口来“作画”。最后通过GLSurfaceView的setRenderer(GLSurfaceView.Renderer renderer)方法,就可以将纸笔关联起来了。

实现Renderer需要实现它的三个接口onSurfaceCreated(GL10 gl, EGLConfig config)、 onSurfaceChanged(GL10 gl, int width, int height)、onDrawFrame(GL10 gl)

3.1 onSurfaceCreated

原型:public abstract void onSurfaceCreated (GL10 gl, EGLConfig config)

它在surface创建时被调用,一般这里做一些初始化的工作,一般第二个参数不用管,第一个参数是GL10是OpenGL ES的绘图接口,它实际上是GLES31的一个实例。

3.2 onSurfaceChangeed

原型:public abstract void onSurfaceChanged (GL10 gl, int width, int height)

当GLSurfaceView大小改变时,对应的Surface大小也会改变,在Surface刚创建的时候,它的size其实是0,画第一次图之前它也会被调用一次的,一些和长宽相关的初始化工作还得在此函数中来做。

3.3 onDrawFrame

原型:onDrawFrame(GL10 gl)

每画一个图都会调用一次,有两种模式可以选择,第一种模式(RENDERMODE_CONTINUOUSLY):连续不断的刷,画完一幅图马上又画下一幅。这种模式是用来画动画的;第二种模式(RENDERMODE_WHEN_DIRTY):只有在需要重画的时候才画下一幅。

4.坐标系,下面是openGL的坐标系,需要将这个坐标系和GLSurfaceView的Surface做一个映射关系,glMatrixMode(GL10.GL_PROJECTION);是说我们现在改变的是坐标系与Surface的映射关系(也就是投影矩阵)。

android studio | openGL es 3.0增强现实(AR)开发 (3) OpenGL es3.0基本知识介绍_第3张图片

相关参数含义:

  • GL_PROJECTION是对投影矩阵操作;
  • GL_MODELVIEW是对模型视图矩阵操作;
  • GL_TEXTURE是对纹理矩阵进行随后的操作;

5.透视投影

###glFrustumf (float left, float right, float bottom, float top, float zNear, float zFar) 这个函数实现了Surface和坐标系之间的透视投影映射关系,如下图中所示。
android studio | openGL es 3.0增强现实(AR)开发 (3) OpenGL es3.0基本知识介绍_第4张图片

6数据缓冲

OpenGL 是一个非常底层的画图接口,它所使用的缓冲区存储结构是和我们的 java 程序中不相同的。Java 是大端字节序(BigEdian),而 OpenGL 所需要的数据是小端字节序(LittleEdian)。所以,我们在将 Java 的缓冲区转化为 OpenGL 可用的缓冲区时需要作一些工作。

不管我们的数据是整型的还是浮点型的,为了完成 BigEdian 到 LittleEdian 的转换,首先需要一个 ByteBuffer。我们通过它来得到一个可以改变字节序的缓冲区。

ByteBuffer mBuffer = ByteBuffer.allocateDirect(pointCount*dimension*4);
mBuffer.order(ByteOrder.nativeOrder());

注意,我们应该用“allocateDirect”来分配内存空间,因为这样才可以 order 排序。最后我们就可以通过下面的方式,将字节缓冲区转化为整型或者浮点型缓冲区。


resultBuffer = mBuffer.asFloatBuffer();
resultBuffer = mBuffer.asIntBuffer();

如果你还有问题没解决,你可以加入我们一起交流,专注于AR的在移动端的实现

这里写图片描述

或是关注我们的技术公众号,提供技术干货的地方,你有干货可以联系本人代发。

这里写图片描述

如果你觉得写的不错,对你有用,请在下面点个 支持一下嘛,有问题可以在下面留言评论。


Reference:

1.http://wiki.jikexueyuan.com/project/opengl-es-guide/coordinate.html
2.http://blog.csdn.net/jason0539/article/details/9164885
3.https://developer.android.com/reference/android/opengl/GLSurfaceView.html
4.http://wiki.jikexueyuan.com/project/opengl-es-guide/pipeline.html

你可能感兴趣的:(android,openGL,es)