opengl es学习笔记一

来源:互联网 发布:vscode windows xp 编辑:程序博客网 时间:2024/05/24 06:28

首先明白opengl和opengl es的关系,我想opengl的接受网站上到处都是了,这里就不啰嗦了,我的理解就是opengl es是opengl的子集,是针对嵌入式设备而设计的API!

我的这些博客是学习openglES Game Development的笔记,所以看不懂我这里说明的可以找原文看下!而且我学习opengl es是为了android中的应用所以我这里略去了C和C++的原来代码!

 

首先学习opengl es必须要理解几个概念:EGL,EGLDisplay,EGLContext,EGLSurface,FrameBuffer, GL……

 

 

EGL:他提供了一个与平台无关的层让OpenGL ES和native windowing system交互。 OpenGL ES 本质上是一个状态机,而 EGL 则是用于监控这些状态以及维护 Frame buffer 和其他渲染 Surface 的外部层。可以说他管理这opengl的各种功能。比如opengl正常绘制时会有一个默认的RGBA,如果有因为光照或者纹理映射造成的颜色以及透明度等偏差都不会被表现出来。所以程序人员需要通过EGL改变当前的渲染模式由普通的颜色模式修改为光照模式,而且使用egl的glEnable(GL_TEXTURE2D)功能就可以将OPENGL中的纹理映射功能的状态设置为开,那么EGL控制下的绘制流程中将会加入纹理映射这一步骤。

EGL有自己的数据类型,这也是为了能做到更好的平台无关性

EGLDisplay:是EGL的一个数据类型,代表显示器(systemdisplay id或者是句柄)。使用eglGetDisplay(NativeDisplaydpy)获得,参数一般为EGL_DEFAULT_DISPLAY 。

EGLContext:存储OpenGL ES的状态信息

EGLSurface:可渲染的视图类。类似于画布。他一般有三种可能。一种是可以直接显示在display上的surface;第二种是在内存中以位图方式保存的surface;第三种就在显存中的帧的方式保存的surface

FrameBuffer:此对象被用来存放渲染的结果,FrameBuffer可以使你对颜色,模型,色深等的创建精确。其中包括了RGBA的信息!

Depth Buffer:也被称为z -Buffer存储像素与眼睛(eye 或是view point)的距离。

Stencil Buffer:相对于android中的clipPath功能或者是J2ME的setClip的功能

 

GL:是EGL的核心库,该概念将在下一章具体介绍

要想使用EGL需要几步比较固定的配置,以下是android中的应用代码:


EGL10 egl = (EGL10) EGLContext.getEGL();EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);int[] version = new int[2];egl.eglInitialize(dpy, version);int[] configSpec = { EGL10.EGL_RED_SIZE, 5, EGL10.EGL_GREEN_SIZE, 6,EGL10.EGL_BLUE_SIZE, 5, EGL10.EGL_DEPTH_SIZE, 16,EGL10.EGL_NONE };EGLConfig[] configs = new EGLConfig[1];int[] num_config = new int[1];int config_size = 1;// configSpec:定义一个希望从系统获得的配置,即指定了选择配置时需要参照的属性。// configs:将返回一个最接近你的需求的配置并存放在configs中,即存放一个按照 configSpec 排序的平台有效的所有//         EGL framebuffer 配置列表。//config_size: 指定了可以返回到 configs 的总配置个数。// num_config: 返回了实际匹配的配置总数。egl.eglChooseConfig(dpy, configSpec, configs, config_size, num_config);EGLConfig config = configs[0];//根据配置返回EGLContext对象EGLContext context = egl.eglCreateContext(dpy, config,EGL10.EGL_NO_CONTEXT, null);// 来创建一个可实际显示的 Surface。系统通常还支持另外两种 Surface: PixmapSurface// 和 PBufferSurface,这两种都不是可显示的 Surface, PixmapSurface// 是保存在系统内存中的位图,PBuffer 则是保存在显存中的帧。EGLSurface surface = egl.eglCreateWindowSurface(dpy, config, sHolder,null);// 函数用来绑定渲染上下文到渲染面egl.eglMakeCurrent(dpy, surface, surface, context);//获得GL10对象方便以后使用GL10 gl = (GL10) context.getGL();

OK,需要掌控的对象已经获得了,下一章就需要利用这些对象来画了

 

原创粉丝点击