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 面向物件對應於面向過程,是開發人員在開發過程當中的思路,是程式設計師的世界觀 解釋性對應於編譯性語言。 解釋