1. 程式人生 > >opengles3.0基礎學習(一)

opengles3.0基礎學習(一)

struct ESContext

{

   /// Put platform specific data here

   void       *platformData;

   /// Put your user data here...

   void       *userData;

   /// Window width

   GLint       width;

   /// Window height

   GLint       height;

#ifndef __APPLE__

   /// Display handle

   EGLNativeDisplayType eglNativeDisplay;

   /// Window handle

   EGLNativeWindowType  eglNativeWindow;

   /// EGL display

   EGLDisplay  eglDisplay;

   /// EGL context

   EGLContext  eglContext;

   /// EGL surface

   EGLSurface  eglSurface;

#endif

   /// Callbacks

   void ( ESCALLBACK *drawFunc ) ( ESContext * );

   void ( ESCALLBACK *shutdownFunc ) ( ESContext * );

   void ( ESCALLBACK *keyFunc ) ( ESContext *, unsigned char, int, int );

   void ( ESCALLBACK *updateFunc ) ( ESContext *, float deltaTime );

};

GLboolean ESUTIL_API esCreateWindow ( ESContext *esContext, const char *title, GLint width, GLint height, GLuint flags )

{

#ifndef __APPLE__

   EGLConfig config;

   EGLint majorVersion;

   EGLint minorVersion;

   EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE };

   if ( esContext == NULL )

   {

      return GL_FALSE;

   }

#ifdef ANDROID

   // For Android, get the width/height from the window rather than what the

   // application requested.

   esContext->width = ANativeWindow_getWidth ( esContext->eglNativeWindow );

   esContext->height = ANativeWindow_getHeight ( esContext->eglNativeWindow );

#else

   esContext->width = width;

   esContext->height = height;

#endif

   if ( !WinCreate ( esContext, title ) )

   {

      return GL_FALSE;

   }

   //查詢可用的顯示器裝置

   esContext->eglDisplay = eglGetDisplay( esContext->eglNativeDisplay );  //  esContext->eglNativeDisplay = EGL_DEFAULT_DISPLAY;

   if ( esContext->eglDisplay == EGL_NO_DISPLAY )

   {

      return GL_FALSE;

   }

   // Initialize EGL

   if ( !eglInitialize ( esContext->eglDisplay, &majorVersion, &minorVersion ) )

   {

      return GL_FALSE;

   }

   {

      EGLint numConfigs = 0;

      EGLint attribList[] =

      {

         EGL_RED_SIZE,       5,

         EGL_GREEN_SIZE,     6,

         EGL_BLUE_SIZE,      5,

  EGL_ALPHA_SIZE,     ( flags & ES_WINDOW_ALPHA ) ? 8 : EGL_DONT_CARE,

         EGL_DEPTH_SIZE,     ( flags & ES_WINDOW_DEPTH ) ? 8 : EGL_DONT_CARE,

         EGL_STENCIL_SIZE,   ( flags & ES_WINDOW_STENCIL ) ? 8 : EGL_DONT_CARE,

         EGL_SAMPLE_BUFFERS, ( flags & ES_WINDOW_MULTISAMPLE ) ? 1 : 0,

         // if EGL_KHR_create_context extension is supported, then we will use

         // EGL_OPENGL_ES3_BIT_KHR instead of EGL_OPENGL_ES2_BIT in the attribute list

         EGL_RENDERABLE_TYPE, GetContextRenderableType ( esContext->eglDisplay ),

         EGL_NONE

      };

      // Choose config

      if ( !eglChooseConfig ( esContext->eglDisplay, attribList, &config, 1, &numConfigs ) )

      {

         return GL_FALSE;

      }

      if ( numConfigs < 1 )

      {

         return GL_FALSE;

      }

   }

#ifdef ANDROID

   // For Android, need to get the EGL_NATIVE_VISUAL_ID and set it using ANativeWindow_setBuffersGeometry

   {

      EGLint format = 0;

      eglGetConfigAttrib ( esContext->eglDisplay, config, EGL_NATIVE_VISUAL_ID, &format );

      ANativeWindow_setBuffersGeometry ( esContext->eglNativeWindow, 0, 0, format );

   }

#endif // ANDROID

   // Create a surface

   esContext->eglSurface = eglCreateWindowSurface ( esContext->eglDisplay, config,

                                                    esContext->eglNativeWindow, NULL );

   if ( esContext->eglSurface == EGL_NO_SURFACE )

   {

      return GL_FALSE;

   }

   // Create a GL context

   esContext->eglContext = eglCreateContext ( esContext->eglDisplay, config,

                                              EGL_NO_CONTEXT, contextAttribs );

   if ( esContext->eglContext == EGL_NO_CONTEXT )

   {

      return GL_FALSE;

  }

   // Make the context current

   if ( !eglMakeCurrent ( esContext->eglDisplay, esContext->eglSurface,

                          esContext->eglSurface, esContext->eglContext ) )

   {

      return GL_FALSE;

   }

#endif // #ifndef __APPLE__

   return GL_TRUE;

}

android建立eglwindow:

 1.初始化egldisplay:

    esContext->eglNativeDisplay = EGL_DEFAULT_DISPLAY;

 2.根據display初始化egl,eglInitialize

 3.根據EGL屬性,獲取opengl的配置。

 4.通過config得到egl的format.

 5.通過format設定buffer的格式。

 6.建立eglsurface, eglCreateWindowSurface.

 7.建立eglCreateContext

 8.繫結eglsurface與eglcontext的繫結

1.opengl渲染方式:

    OpenGl ES關於渲染方式有以下兩種:

    RENDERMODE_CONTINUOUSLY和RENDERMODE_WHEN_DIRTY。

    預設渲染方式為RENDERMODE_CONTINUOUSLY,這兩種渲染的含義是:

    RENDERMODE_CONTINUOUSLY:渲染器會不停地渲染場景,

    RENDERMODE_WHEN_DIRTY:只有在建立和呼叫requestRender()時才會重新整理。

一般設定為RENDERMODE_WHEN_DIRTY方式,這樣不會讓CPU一直處於高速運轉狀態,提高手機電池使用時間和軟體整體效能。

2.eclipse跟蹤OPENGL:

glDisable(GL_DITHER):關閉dither

glFinish():

By doing a finish here we force the GL driver to start rendering

all the drawcalls up to this point, and to wait for the rendering to be complete

4.opengl-es:

a. 獲取Display。

Display代表顯示器,在有些系統上可以有多個顯示器,也就會有多個Display。獲得Display要呼叫EGLboolean eglGetDisplay(NativeDisplay dpy),引數一般為 EGL_DEFAULT_DISPLAY 。該引數實際的意義是平臺實現相關的,在X-Window下是XDisplay ID,在MS Windows下是Window DC。

b. 初始化egl。

呼叫 EGLboolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor),該函式會進行一些內部初始化工作,並傳回EGL版本號(major.minor)。

c. 選擇Config。

所為Config實際指的是FrameBuffer的引數,在MS Windows下對應於PixelFormat,在X-Window下對應Visual。一般用EGLboolean eglChooseConfig(EGLDisplay dpy, const EGLint * attr_list, EGLConfig * config, EGLint config_size, EGLint *num_config),其中attr_list是以EGL_NONE結束的引數陣列,通常以id,value依次存放,對於個別標識性的屬性可以只有 id,沒有value。另一個辦法是用EGLboolean eglGetConfigs(EGLDisplay dpy, EGLConfig * config, EGLint config_size, EGLint *num_config) 來獲得所有config。這兩個函式都會返回不多於config_size個Config,結果儲存在config[]中,系統的總Config個數儲存 在num_config中。可以利用eglGetConfig()中間兩個引數為0來查詢系統支援的Config總個數。

Config有眾多的Attribute,這些Attribute決定FrameBuffer的格式和能力,通過eglGetConfigAttrib ()來讀取,但不能修改。

d. 構造Surface。

Surface實際上就是一個FrameBuffer,通過 EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig confg, NativeWindow win, EGLint *cfg_attr) 來建立一個可實際顯示的Surface。系統通常還支援另外兩種Surface:PixmapSurface和PBufferSurface,這兩種都不 是可顯示的Surface,PixmapSurface是儲存在系統記憶體中的點陣圖,PBuffer則是儲存在視訊記憶體中的幀。

Surface也有一些attribute,基本上都可以故名思意, EGL_HEIGHT EGL_WIDTH EGL_LARGEST_PBUFFER EGL_TEXTURE_FORMAT EGL_TEXTURE_TARGET EGL_MIPMAP_TEXTURE EGL_MIPMAP_LEVEL,通過eglSurfaceAttrib()設定、eglQuerySurface()讀取。

e. 建立Context。

OpenGL的pipeline從程式的角度看就是一個狀態機,有當前的顏色、紋理座標、變換矩陣、絢染模式等一大堆狀態,這些狀態作用於程式提交的頂點 座標等圖元從而形成幀緩衝內的畫素。在OpenGL的程式設計介面中,Context就代表這個狀態機,程式的主要工作就是向Context提供圖元、設定狀 態,偶爾也從Context裡獲取一些資訊。

用EGLContext eglCreateContext(EGLDisplay dpy, EGLSurface write, EGLSurface read, EGLContext * share_list)來建立一個Context。

f. 繪製。

應用程式通過OpenGL API進行繪製,一幀完成之後,呼叫eglSwapBuffers(EGLDisplay dpy, EGLContext ctx)來顯示

相關推薦

opengles3.0基礎學習

struct ESContext {    /// Put platform specific data here    void       *platformData;    /// Put your user data here...    void   

vue基礎學習

time tle eight pla use logs new dial for 01-01 vue使用雛形      <div id="box"> {{msg}} </div> <sc

Python基礎學習

func exe function 學習 typeerror exit invalid min eas #Default Argument Values & in keyworddef ask_ok(prompt, retres=4, reminder=‘pleas

vue2.0基礎學習2

center itl put keyword example 周期 med 移除監聽器 博客 (三)Vue2.0-選項 選項就是在Vue構造器裏的配置功能的前綴 propsData 只用於 new 創建的實例中。 var Comp = Vue.extend({ pr

linux菜鳥基礎學習

導致 erp redhat ado water 切換用戶 學習 方法 x86 熟悉linux環境 1.虛擬機的控制虛擬機是在真機上建立的,為何要建立虛擬機,主要是防止由於錯誤操作導致不可挽回的結果。[kiosk@foundation0 Desktop]$ rht-vmctl

CSS基礎學習 之 line-height && height 屬性區別

  官方定義: height:定義了了元素的高度。預設情況下,該屬性訂了 content area(內容區域) 的高度。如果box-sizing屬性設定為 border-box,那麼height就表示border-area的高度。 line-height:用來設定多行元素的空間量,比如文字。對

postgresql基礎學習——基本命令和部分邏輯結構

目錄   安裝和配置 基本操作 邏輯結構 結構簡圖 結構說明 schema操作 小結: 安裝和配置 PostGresql ubuntu安裝: apt-get install postgresql service postgresql st

python基礎學習--資料型別

Python一個 高階語言         2017-09-19 1.1  Python背景簡介(感謝偉大的廖雪峰大佬帶我們走上一條光頭路,嘿嘿) 寫了大半年Python程式碼,感覺收穫不是很大,都是現學現賣,沒有系統的瞭解過這個語言究竟是什麼樣的,從

gensim基礎學習

       最近參加了個長文字分類的比賽,然後開始使用gensim,一個很強大的NLP神器,用於從原始的非結構化的文字中,無監督地學習到文字隱層的主題向量表達,在此記錄一下使用心得。 目錄 基本概念 基本概念 語料(Corpus)

原生webgl基礎學習 引言

一.筆者自述                對於原生WebGL的學習,相信對於很多搞前端圖形開發的小夥伴的痛點是花了很多時間,卻收效甚微;好在現在存在諸如Three.js、Babylon.js、cesium.js等功能強大和齊全的WebGL第三方庫;有了這些第三方庫,我們可

android java 與 native互動 基礎學習

javap 與javah的用法 javap 的用法: cd 到 class 所在的目錄: javap -classpath . -s Bean(類名) java h的用法一: native 所在的資料夾。ExampleUnitTest 資料夾所在的包

MySQL基礎學習

MySQL基礎(一) 1 安裝與配置 選擇典型安裝 在安裝目錄檔案中找到my.ini檔案 修改my.ini檔案中: [mysql] default-character-set=utf8 2 啟動與停止 在Windo

R基礎學習-- 連接mysql數據庫

The url 3.5 select fff spec 2.3 rstudio length 測試環境:win10+RStudio (1)在Console加載兩個插件 >install.packages(‘DBI‘) Installing package i

大資料探勘之Scala零基礎學習

第5章 函式5.1函式程式程式碼:object section5_1 extends App { // def gcd(x:Int,y:Int):Int=if(x%y==0) y else gcd(

Java基礎學習資料結構

基礎問題  1. 幾類資料結構的定義和區別是什麼? 2. 容器的資料結構底層是怎麼實現的?怎麼進行擴容? 3. 容器的執行緒安全怎麼實現? 一、List容器 資料有序,允許重複資料,執行緒不安全。 1. linkedList  底層用雙向連結串列實現,操作速度快,可以在頭、尾、[n]操作資料。 2. Arr

Java Web基礎學習

Java的Web開發學習 Web應用程式 Web應用程式是一種可用通過Web訪問的應用程式。Web應用程式的一個最大好處是使用者很容易訪問應用程式。使用者只需要有瀏覽器即可,不需要再安裝其他軟體。 軟體開發三大方向: ²  桌面應用程式(C/S) ²  Web應用程式(B/

Vue.js基礎學習

Vue.js基礎學習 一 Vue.js 是什麼 1.宣告式渲染 2.條件(v-if)與迴圈(v-for) 3.處理使用者輸入(v-on與v-model) `v-on`事件監聽器 `v-mode

SQL基礎學習

一.SQL的定義:       SQL指結構化查詢語言,讓我們可以對資料庫進行訪問,市一中ANSI的標準計算機語言。 二.SQL的語句簡析:     1.查詢語句:          select 列名稱 from 表名稱 (查詢某一列資料)          selec

html基礎學習

近期學習的html 記錄一下 1、標題標籤 <h1>標題標籤</h1> <h2>標題標籤</h2> <h3>標題標籤</h3> <h4>標題標籤</h4> <h5>

Python基礎學習之Python的概述與環境安裝

Python介紹 Python語言介紹 Python是一門高階的、面向物件的、解釋性、指令碼語言。 高階語言:貼近開發者,對應底層語言,底層語言貼近機器;java、C#、php 、ruby 面向物件對應於面向過程,是開發人員在開發過程當中的思路,是程式設計師的世界觀 解釋性對應於編譯性語言。 解釋