成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

bada開發(fā):OpenGL ES 2.0程序 創(chuàng)建簡單3D圖形

移動開發(fā)
本文介紹基于三星bada平臺開發(fā)OpenGL ES 2.0的基本概念,我們首先開始介紹一個簡單的范例。我們要處理的一個程序就是基本的OpenGL ES 2.0程序,畫出簡單的3D立方。

我們期待消費者積極關(guān)注bada這個全新的移動游戲平臺,因為強大的圖形API可以實現(xiàn)2D和3D圖形。從3D圖形API中獲益的程序包括游戲,地圖可視化,用戶界面,動漫,屏保等。為了滿足廣大需求,bada API包括OpenGL® ES,用于高級嵌入式圖形,具有明確定義的OpenGL的subset profile的規(guī)格,支持高級和低級圖形功能。

如何使用bada基于OpenGL ES 2.0創(chuàng)建簡單的3D圖形應(yīng)用程序

我們看看如何創(chuàng)建一個OpenGL ES 2.0應(yīng)用程序。為了介紹基于bada平臺開發(fā)OpenGL ES 2.0程序的基本概念,我們首先開始介紹一個簡單的范例。我們要處理的一個程序就是基本的OpenGL ES 2.0程序,畫出簡單的3D立方。這個范例說明許多重要的概念。

初始化

• 初始化,并且處理EGL和GL;

• 使用EGL,創(chuàng)建一個屏幕上的渲染面

• 創(chuàng)建安裝和上載遮影及程序

圖畫

• 設(shè)置viewport.

• 繪制簡單的圖元

bada 3D Graphics API

圖:bada 3D Graphics API

初始化

1. 初始化和處理EGL和GL

bada GlesCube樣例程序遵循的基本步驟使用特定的API以完成EGLand GL初始化(通過 GlesCube::InitEGL() 和 InitGL() 方法)。

1.1. 檢索缺省設(shè)備屏幕

__eglDisplay變量代表設(shè)備顯示。OpenGL ES配置被存儲在 __eglConfig里。

__eglContext 變量代表OpenGL ES context。***, __eglSurface 代表繪圖表面。

  1. __eglDisplay = eglGetDisplay((EGLNativeDisplayType)EGL_DEFAULT_DISPLAY); 

EGL_DEFAULT_DISPLAY 常量指的是缺省設(shè)備屏幕(在大多數(shù)情況下,只有一個)。如果操作失敗,函數(shù)會返回EGL_NO_DISPLAY.

1.2.初始化 OpenGL ES

函數(shù)中的***兩個參數(shù)與EGL執(zhí)行版對應(yīng)。如果不需要指定,則取值為零。

  1. if (EGL_FALSE == eglInitialize(__eglDisplay, nullnull) || EGL_SUCCESS != eglGetError()) 

1.3. 選擇OpenGL ES配置

下一步,必須指定程序要求的最小配置。

  1. if (EGL_FALSE == eglChooseConfig(__eglDisplay, eglConfigList, &__eglConfig, 1,  &numConfigs) ||   
  2.     EGL_SUCCESS != eglGetError())  
  3.  
  4. {         
  5.            AppLog("[GlesCube] eglChooseConfig() has been failed. [0x%x]\n",eglGetError())  
  6.            goto CATCH;  

eglConfigList參數(shù)代表程序要求的屬性列表。函數(shù)在__eglConfig參數(shù)中返回所有可得配置(符合eglConfigList參數(shù))列表。列表的大小受到第四個參數(shù)(在本例中,我們只要一個配置)限制。在函數(shù)返回之后,numConfigs參數(shù)告知相匹配參數(shù)的數(shù)量。eglConfigList定義了 [attribute, value] 對的次序(作為數(shù)列)。EGL規(guī)格定義了所有受支持的屬性的常量。列表***是EGL_NONE常量。

  1. EGLint eglConfigList[] = {  
  2.       EGL_RED_SIZE, 5,  
  3.       EGL_GREEN_SIZE,   6,  
  4.  
  5.       EGL_BLUE_SIZE,    5,  
  6.       EGL_ALPHA_SIZE,   0,  
  7.       EGL_DEPTH_SIZE,       8,  
  8.  
  9.       EGL_SURFACE_TYPE, EGL_WINDOW_BIT,  
  10.       EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,  
  11.       EGL_NONE  
  12. }; 

 1.4. 創(chuàng)建OpenGL ES context

  1. __eglContext = eglCreateContext(__eglDisplay, __eglConfig, EGL_NO_CONTEXT, eglContextList);  
  2.  
  3. if (EGL_NO_CONTEXT == __eglContext || EGL_SUCCESS != eglGetError())  
  4. {  
  5.             AppLog("[GlesCube] eglCreateContext()has been failed.[0x%x]\n", eglGetError());  
  6.  
  7.             goto CATCH;  

第三個參數(shù)顯示 context 要分享紋理對象。這里,EGL_NO_CONTEXT被用來說明沒有這樣的 context 。***一個參數(shù)代表要映射到下一個context的屬性列表。

1.5. 激活context

如果要OpenGL ES 指令產(chǎn)生效果,必須激活context, 讓它成為現(xiàn)在式。在OpenGL ES中,一次只有一個context可以成為現(xiàn)在式。

  1. if (EGL_FALSE == eglMakeCurrent(__eglDisplay, __eglSurface, __eglSurface, __eglContext) ||   
  2.         EGL_SUCCESS != eglGetError())  
  3.  
  4. {         
  5.     AppLog("[GlesCube] eglMakeCurrent() has been failed. [0x%x]\n", eglGetError());  
  6.     goto CATCH;  

1.6 關(guān)閉OpenGL ES: 在使用OpenGL ES,必須釋放所有資源

  1. void GlesCube::DestroyGL()  
  2. {  
  3.     glDeleteProgram(__programObject);     
  4.  
  5.    
  6.     if (__eglDisplay)  
  7.     {  
  8.         eglMakeCurrent(__eglDisplay, nullnullnull);  
  9.  
  10.    
  11.         if (__eglContext)  
  12.         {  
  13.             eglDestroyContext(__eglDisplay, __eglContext);  
  14.             __eglContext = EGL_NO_CONTEXT;  
  15.  
  16.         }  
  17.    
  18.         if (__eglSurface)   
  19.         {  
  20.             eglDestroySurface(__eglDisplay, __eglSurface);  
  21.  
  22.             __eglSurface = EGL_NO_SURFACE;  
  23.         }  
  24.    
  25.         eglTerminate(__eglDisplay);  
  26.         __eglDisplay = EGL_NO_DISPLAY;  
  27.  
  28.     }  
  29.    
  30.     return;  

2. 使用EGL,創(chuàng)建一個屏幕上的渲染面

  1. __eglSurface = eglCreateWindowSurface(__eglDisplay, __eglConfig,  
  2.                                     (EGLNativeWindowType)__pForm, null);  
  3.  
  4. if (EGL_NO_SURFACE == __eglSurface || EGL_SUCCESS != eglGetError())  
  5. {         
  6.  AppLog("[GlesCube] eglCreateWindowSurface() has been failed. EGL_NO_SURFACE [0x%x]\n", eglGetError());  
  7.  
  8.  goto CATCH;  

3. 創(chuàng)建,安裝和上載 遮影及程序

要求采取下面的步驟設(shè)置OpenGL環(huán)境,上載并且編輯遮影。

3.1. 創(chuàng)建片元(fragment)和vertex shaders,及程序目標

  1. GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);  
  2. GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);  
  3.  
  4.    
  5. __programObject = glCreateProgram(); 

3.2. 將shader的對象依附在程序?qū)ο笊?/p>

程序?qū)ο筇峁┮粋€機制,可以確定需要連接起來的事物的列表。

將被連接在一起,放入程序?qū)ο笾械腟haders必須首先與該程序?qū)ο筮B接起來。在源代碼被上載到shader的對象之前或在shader的對象被編譯之前,你可以向程序?qū)ο笳迟N一個shader的對象。

  1. glAttachShader(__programObject, fragShader);  
  2.  
  3. glAttachShader(__programObject, vertShader); 

3.3. 上載shader的二元

函數(shù)glShaderBinary上載預先編輯的shader的二元。***個參數(shù)指定fragShader中shader object handle的數(shù)量。fragShader包含一個shader object handle。每個handle指示一個獨特的遮影類型( vertex shader 或片元shader).。(GLenum)0指定shader的二元格式。fragmentFragment 或 vertexVertex 向客戶端內(nèi)存里的shader二元數(shù)據(jù)指定一個指針。***一個參數(shù)指定字節(jié)中shader二元數(shù)據(jù)的長度。

  1. glShaderBinary(1, &fragShader, (GLenum)0, fragmentFragment, fragmentFragmentLength *   
  2.  
  3. sizeof(int));  
  4. glShaderBinary(1, &vertShader, (GLenum)0, vertexVertex, vertexVertexLength * sizeof(int)); 

3.4. 為遮影對象提供源代碼

這個方法將遮影中的源代碼設(shè)定到字符串列(fragmentFragmentText 和vertexVertexText參數(shù))中的源代碼上。任何之前存儲在遮影對象中的源代碼被完全取代。

  1. glShaderSource(fragShader, 1, (const char**)&fragmentFragmentText, null);  
  2.  
  3. glShaderSource(vertShader, 1, (const char**)&vertexVertexText, null); 

3.5. 編輯shaders

glCompileShader編輯存儲在fragShader 和vertShader參數(shù)指定的shader object中的源字符串。編輯狀態(tài)作為shader object狀態(tài)的一部分被儲存。

  1. glCompileShader(fragShader);  
  2. glCompileShader(vertShader); 

注意,glCompileShader僅在GL version 2.0 或更高版本中可獲得。

3.6. 鏈接程序?qū)ο?/p>

glLinkProgram鏈接程序指定的程序?qū)ο蟆H绻魏蜧L_VERTEX_SHADER 類型的shader object被粘貼到程序上,它們被用來創(chuàng)建一個可執(zhí)行文件,在可編程vertex處理器上運行。如果任何GL_FRAGMENT_SHADER類型的shader object被粘貼到程序上,它們創(chuàng)建一個可執(zhí)行文件,在可編程片元處理器上運行。

  1. glLinkProgram(__programObject); 

3.7. 使用程序?qū)ο螅皇枪潭ǖ暮瘮?shù)OpenGL

這個方法安裝程序指定的程序?qū)ο螅鰹楝F(xiàn)在的渲染狀態(tài)。一個或多個可執(zhí)行文件在程序?qū)ο笾袆?chuàng)建,使用glAttachShader將shader object成功地粘貼到它上面,使用glAttachShader成功編譯shader object,并且使用glLinkProgram連接程序?qū)ο蟆?/p>

  1. glUseProgram(__programObject); 

程序?qū)ο蟀\行在vertex(片元)處理器上的可執(zhí)行文件,如果它們包含一個或多個被成功編譯和鏈接的GL_VERTEX_SHADER (typeGL_FRAGMENT_SHADER)類型的shader object。

3.8你可以使用:

  1. glDeleteShader(vertShader);  
  2. glDeleteShader(fragShader); 

刪除shader object.

在GlesCube::InitGL()方法里,所有的初始化步驟完成。如果所有的shaders被成功編譯,并且程序?qū)ο蟊怀晒︽溄樱琯lUseProgram之后使用shader完成所有的渲染。現(xiàn)在,有個準備好的GL表面進行處理。

我們來看看包含了OpenGL繪圖函數(shù)的GlesCube::Draw()方法。

繪圖

4.設(shè)定viewport

glViewport 函數(shù)向窗口坐標指定被常規(guī)化的設(shè)備坐標的X和Y的仿射轉(zhuǎn)換。***批兩個參數(shù)在viewport 長方形的左下角(以像素為單位)。缺省值為 (0,0).。當OpenGL context 首先被附加窗口,寬度和高度被設(shè)定到窗口的尺度上。

  1. int x, y, width, height;  
  2.  
  3. GetAppFrame()->GetFrame()->GetBounds(x, y, width, height);  
  4.  
  5. glViewport(00, width, height); 

讓 (xnd , ynd ) 成為常規(guī)化設(shè)備坐標。窗口坐標(xw , yw)然后如下所示進行計算:

 xw = (xnd + 1) * (width / 2) + x; yw = (ynd + 1) * (height / 2) + y;

Viewport寬度和高度被堆放,其范圍根據(jù)執(zhí)行情況確定。這個范圍通過使用argument GL_MAX_VIEWPORT_DIMS 調(diào)用glGet進行查詢。

5. 繪制簡單的圖元

OpenGL ES渲染所有的來自vertex數(shù)列的集合。不用調(diào)用GL函數(shù)以傳遞每個

vertex, 常規(guī)項,紋理,坐標,邊標志或顏色,你可以分開vertex, 常規(guī)項,和其它參數(shù)的數(shù)列,使用它們構(gòu)建一個圖元的次序(單獨調(diào)用glDrawElements),并渲染來自數(shù)據(jù)列的圖元。

例如,這顯示了如何渲染OpenGL ES中的三角形。

  1. const GLfloat vertices[] = {  
  2.     -0.5f, -0.5f, -0.5f,  
  3.  
  4.     -0.5f, -0.5f,  0.5f,  
  5.      0.5f, -0.5f,  0.5f,  
  6.  
  7.      0.5f, -0.5f, -0.5f,  
  8.     -0.5f,  0.5f, -0.5f,  
  9.  
  10.              ………………….  
  11.      0.5f,  0.5f, -0.5f  
  12.      };  
  13.    
  14. glVertexAttribPointer(__idxPosition, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GL_FLOAT), vertices);  
  15.  
  16. glVertexAttribPointer(__idxColor, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GL_FLOAT), colors);  
  17.  
  18.    
  19. glEnableVertexAttribArray(__idxPosition);  
  20. glEnableVertexAttribArray(__idxColor);  
  21.    
  22. glUniformMatrix4fv(__idxMVP, 1, GL_FALSE, (GLfloat*) &__matMVP.m[0][0]);  
  23.  
  24.    
  25. glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, indices); 

glDrawElements使用較少的次常式調(diào)用,指定多個子程序圖元。

當glDrawElements被調(diào)用,它使用被啟用的數(shù)列中次序元素,首先從標記體開始,構(gòu)建一系列集合圖元。***個參數(shù)指定構(gòu)建何種圖元,并且如何構(gòu)建這些圖元。

GlesCube樣例程序位于\<BADA_SDK_HOME>\Samples\GlesCube\

要求的文件:SDK已經(jīng)有了所有要求的文件,以創(chuàng)建OpenGL ES程序。OpenGL ES的頁眉文件包括:

• FGraphicsOpegngl2.h

• FGraphicsEgl

• FGraphicsOpengl

原文地址

【編輯推薦】

  1. 三星bada開發(fā)平臺概述
  2. 三星bada全新UI界面設(shè)計
  3. 初體驗三星手機系統(tǒng)bada開發(fā)
  4. 三星策反Symbian開發(fā)者轉(zhuǎn)向bada
  5. 詳解Windows Phone XNA 4.0 3D游戲開發(fā)

 

責任編輯:佚名 來源: bada官網(wǎng)
相關(guān)推薦

2013-07-25 09:32:26

OpenGL ESAndroid4.3

2014-04-24 11:16:00

OpenGL ES 2入門

2013-09-02 15:46:06

OpenGLWindows

2017-09-19 14:05:24

web

2014-04-29 14:16:54

2014-04-24 13:26:24

OpenGL ES2.iOSiPhone

2014-04-24 13:35:11

OpenGL ES2.iOSAndroid

2011-06-27 15:57:21

Qt 3D OpenGL

2013-01-30 16:15:40

adobeHTML5css3

2014-04-29 14:27:59

OpenGL ES 2Android繪制紋理

2009-03-19 20:41:31

VirtualBox GuestsOpenGL 3D

2017-07-21 11:28:57

前端Threejs3D地圖

2009-03-10 18:16:49

2014-04-24 14:00:35

OpenGL ES 2編程

2013-07-31 14:19:06

Windows 8.1

2013-11-18 17:33:48

微軟Windows 8.1應(yīng)用

2009-03-26 09:00:12

Mozilla瀏覽器3D圖形加速

2009-08-27 18:10:58

PHP繪制3D圖形

2023-08-18 08:00:00

游戲開發(fā)3D模型

2014-04-28 17:30:53

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 伊人手机在线视频 | 日本a∨视频 | 一级特黄视频 | 亚洲人成在线播放 | 久久久不卡网国产精品一区 | 国产真实乱对白精彩久久小说 | 成年人的视频免费观看 | 国产成人a亚洲精品 | 久久亚洲精品视频 | 日日碰狠狠躁久久躁婷婷 | 成人精品国产 | 久久i| 91在线视频一区 | 夜夜久久 | 国产乱码精品一区二区三区av | 综合久| 国产一区二区三区日韩 | 中文字幕一区二区不卡 | 亚州精品天堂中文字幕 | 精品国产乱码久久久久久闺蜜 | 毛片网在线观看 | 亚洲劲爆av | 欧美日韩精品一区二区三区四区 | 国产精品自拍视频网站 | 久久这里有精品 | 精品国产一区二区三区久久狼黑人 | 亚洲午夜一区二区 | 刘亦菲国产毛片bd | 久久精品国产一区二区 | 日本色综合| 美女视频一区二区三区 | 成人一区二区三区视频 | 亚洲精品字幕 | 黑色丝袜三级在线播放 | 精品视频久久久久久 | 成年免费大片黄在线观看岛国 | 欧美性生活一区二区三区 | 四虎影音 | 国产观看 | 日本久久网 | 国产精品成人免费 |