1. 程式人生 > >opengl es學習筆記一

opengl es學習筆記一

首先明白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,需要掌控的物件已經獲得了,下一章就需要利用這些物件來畫了