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

OpenGL ES 簡單教程

移動開發(fā) 移動應(yīng)用
什么是OpenGL ES?OpenGL ES (為OpenGL for Embedded System的縮寫)為適用于嵌入式系統(tǒng)的一個免費二維和三維圖形庫,為桌面版本OpenGL 的一個子集。OpenGL ES 定義了一個在移動平臺上能夠支持OpenGL最基本功能的精 ...

什么是OpenGL ES?

OpenGL ES (為OpenGL for Embedded System的縮寫) 為適用于嵌入式系統(tǒng)的一個免費二維和三維圖形庫。

為桌面版本OpenGL 的一個子集。

OpenGL ES 定義了一個在移動平臺上能夠支持OpenGL最基本功能的精簡標(biāo)準(zhǔn),以適應(yīng)如手機,PDA或其它消費者移動終端的顯示系統(tǒng)。

Khronos Group 定義和管理了OpenGL ES標(biāo)準(zhǔn)。

OpenGL 與 OpenGL ES的關(guān)系OpenGL ES 是基于桌面版本OpenGL 的:

  • OpenGL ES 1.0  基于OpenGL 1.3 , 在2003年發(fā)布
  • OpenGL ES 1.1   基于OpenGL 1.5 ,  在2004年發(fā)布
  • OpenGL ES 2.0  基于OpenGL2.0,   在2007年發(fā)布
  • OpenGL 2.0 向下兼容OpenGL 1.5   而 OpenGL ES 2.0 和OpenGL ES 1.x 不兼容,是兩種完全不同的實現(xiàn)。

OpenGL ES管道(Pipeline)OpenGL ES 1.x 的工序是固定的,稱為Fix-Function Pipeline,可以想象一個帶有很多控制開關(guān)的機器,盡管加工的工序是固定的,但是可以通過打開或關(guān)閉開關(guān)來設(shè)置參數(shù)或者打開關(guān)閉某些功能。 OpenGL ES 2.0 允許提供編程來控制一些重要的工序,一些“繁瑣”的工序比如柵格化等仍然是固定的。(這些開關(guān)被就是state,注意應(yīng)該盡量少的改變state,以免影 響性能)

  • 管道“工序”大致可以分為 Transformation Stage 和 Rasterization Stage兩大步。
  • OpenGL ES 支持的基本圖形為 點Point, 線Line, 和三角形Triangle ,其它所有復(fù)制圖形都是通過這幾種基本幾何圖形組合而成。
  • 在發(fā)出繪圖指令后,會對頂點(Vertices)數(shù)組進行指定的坐標(biāo)變換或光照處理。
  • 頂點處理完成后,通過Rasterizer 來生成像素信息,稱為”Fragments“ 。
  • 對于Fragment 在經(jīng)過Texture Processing, Color Sum ,Fog 等處理并將最終處理結(jié)果存放在內(nèi)存中(稱為FrameBuffer)。
  • OpenGL 2.0可以通過編程來修改上述紅色的部分的步驟,稱為Programmable Shader.

OpenGL ES API 命名習(xí)慣

  • 定義的常量都以GL_為前綴。比如GL10.GL_COLOR_BUFFER_BIT
  • OpenGL ES 指令以gl開頭 ,比如gl.glClearColor
  • 某些OpenGL指令以3f 或4f結(jié)尾,3和4代表參數(shù)的個數(shù),f代表參數(shù)類型為浮點數(shù),如gl.glColor4f ,i,x 代表 int如 gl.glColor4x
  • 對應(yīng)以v結(jié)尾的OpenGL ES 指令,代表參數(shù)類型為一個矢量(Vector) ,如 glTexEnvfv
  • 所有8-bit整數(shù)對應(yīng)到byte 類型,16-bit 對應(yīng)到short類型,32-bit整數(shù)(包括GLFixed)對應(yīng)到int類型,而所有32-bit 浮點數(shù)對應(yīng)到float 類型。
  • GL_TRUE,GL_FALSE 對應(yīng)到boolean類型
  • C字符串((char*)) 對應(yīng)到Java 的 UTF-8 字符串。

創(chuàng)建簡單的opengl es實例 http://developer.Android.com/resources/tutorials/opengl/opengl-es10.html 基本幾何圖形定義OpenGL ES 支持繪制的基本幾何圖形分為三類:點,線段,三角形。也就是說OpenGL ES 只能繪制這三種基本幾何圖形。任何復(fù)雜的2D或是3D圖形都是通過這三種幾何圖形構(gòu)造而成的。 OpenGL ES提供了兩類方法來繪制一個空間幾何圖形:

  • public abstract void glDrawArrays(int mode, int first, int count) 使用VetexBuffer 來繪制,頂點的順序由vertexBuffer中的順序指定。
  • public abstract void glDrawElements(int mode, int count, int type, Buffer indices) ,可以重新定義頂點的順序,頂點的順序由indices Buffer 指定。

mode列表:GL_POINTS 繪制獨立的點、GL_LINE_STRIP繪制一條線段、GL_LINE_LOOP繪制一條封閉線段(首位相連)、GL_LINES繪制多條線段、GL_TRIANGLES繪制多個三角形(兩兩不相鄰)、GL_TRIANGLE_STRIP繪制多個三角形(兩兩相鄰)、GL_TRIANGLE_FAN以一個點為頂點繪制多個相鄰的三角形 對應(yīng)頂點除了可以為其定義坐標(biāo)外,還可以指定顏色,材質(zhì),法線(用于光照處理)等。 glEnableClientState 和 glDisableClientState 可以控制的pipeline開關(guān)可以有:GL_COLOR_ARRAY (顏色) ,GL_NORMAL_ARRAY (法線), GL_TEXTURE_COORD_ARRAY (材質(zhì)), GL_VERTEX_ARRAY(頂點), GL_POINT_SIZE_ARRAY_OES等。 對應(yīng)的傳入顏色,頂點,材質(zhì),法線的方法如下: glColorPointer(int size,int type,int stride,Buffer pointer) glVertexPointer(int size, int type, int stride, Buffer pointer) glTexCoordPointer(int size, int type, int stride, Buffer pointer) glNormalPointer(int type, int stride, Buffer pointer) OpenGL ES 內(nèi)部存放圖形數(shù)據(jù)的Buffer有COLOR ,DEPTH (深度信息)等,在繪制圖形只前一般需要清空COLOR 和 DEPTH Buffer。 三維坐標(biāo)系及坐標(biāo)變換初步OpenGL ES圖形庫最終的結(jié)果是在二維平面上顯示3D物體,這個過程可以分成三個部分:

  • 坐標(biāo)變換,坐標(biāo)變換通過使用變換矩陣來描述,因此學(xué)習(xí)3D繪圖需要了解一些空間幾何,矩陣運算的知識。三維坐標(biāo)通常使用齊次坐標(biāo)來定義。變換矩陣操作可以分為視角(Viewing),模型(Modeling)和投影(Projection)操作,這些操作可以有選擇,平移,縮放,正側(cè)投影,透視投影等。
  • 由于最終的3D模型需要在一個矩形窗口中顯示,因此在這個窗口之外的部分需要裁剪掉以提高繪圖效率,對應(yīng)3D圖形,裁剪是將處在剪切面之外的部分扔掉。
  • 在最終繪制到顯示器(2D屏幕),需要建立起變換后的坐標(biāo)和屏幕像素之間的對應(yīng)關(guān)系,這通常稱為“視窗”坐標(biāo)變換(Viewport) transformation.

如果我們使用照相機拍照的過程做類比,可以更好的理解3D 坐標(biāo)變換的過程。

  • 拍照時***步是架起三角架并把相機的鏡頭指向需要拍攝的場景,對應(yīng)到3D 變換為viewing transformation (平移或是選擇Camera )
  • 然后攝影師可能需要調(diào)整被拍場景中某個物體的角度,位置,比如攝影師給架好三角架后給你拍照時,可以要讓你調(diào)整站立姿勢或是位置。對應(yīng)到3D繪制就是Modeling transformation (調(diào)整所繪模型的位置,角度或是縮放比例)。
  • 之后攝影師可以需要調(diào)整鏡頭取景(拉近或是拍攝遠景),相機取景框所能拍攝的場景會隨鏡頭的伸縮而變換,對應(yīng)到3D繪圖則為Projection transformation(裁剪投影場景)。
  • 按 下快門后,對于數(shù)碼相機可以直接在屏幕上顯示當(dāng)前拍攝的照片,一般可以充滿整個屏幕(相當(dāng)于將坐標(biāo)做規(guī)范化處理NDC),此時你可以使用縮放放 大功能顯示照片的部分。對應(yīng)到3D繪圖相當(dāng)于viewport transformation (可以對最終的圖像縮放顯示等)

對于Viewing transformation (平移,選擇相機)和Modeling transformation(平移,選擇模型)可以合并起來看,只是應(yīng)為向左移動相機,和相機不同將模型右移的效果是等效的。 在OpenGL ES 中,

  • 使用GL10.GL_MODELVIEW 來同時指定viewing matrix 和modeling matrix.
  • 使用GL10.GL_PROJECTION 指定投影變換,OpenGL 支持透視投影(3D)和正側(cè)投影(2D)。
  • 使用glViewport 指定 Viewport 變換。

通用的矩陣變換指令 這里介紹對應(yīng)指定的坐標(biāo)系(比如viewmodel, projection或是viewport) Android OpenGL ES支持的一些矩陣運算及操作。 矩陣本身可以支持加減乘除,對角線全為1的4X4 矩陣成為單位矩陣Identity Matrix 。

  • 將當(dāng)前矩陣設(shè)為單位矩陣的指令 為glLoadIdentity().
  • 矩陣相乘的指令glMultMatrix*() 允許指定任意矩陣和當(dāng)前矩陣相乘。
  • 選擇當(dāng)前矩陣種類glMatrixMode(). OpenGL ES 可以運行指定GL_PROJECTION,GL_MODELVIEW等坐標(biāo)系,后續(xù)的矩陣操作將針對選定的坐標(biāo)。
  • 將當(dāng)前矩陣設(shè)置成任意指定矩陣glLoadMatrix*()
  • 在棧中保存當(dāng)前矩陣和從棧中恢復(fù)所存矩陣,可以使用glPushMatrix()glPopMatrix()
  • 特定的矩陣變換平移glTranslatef(),旋轉(zhuǎn)glRotatef() 和縮放glScalef()

方法public abstract void glTranslatef (float x, float y, float z) 用于坐標(biāo)平移變換。 方法public abstract void glRotatef(float angle, float x, float y, float z)用來實現(xiàn)選擇坐標(biāo)變換,單位為角度。 (x,y,z)定義旋轉(zhuǎn)的參照矢量方向。多次旋轉(zhuǎn)的順序非常重要。 方法public abstract void glScalef (float x, float y, float z)用于縮放變換。 在進行平移,旋轉(zhuǎn),縮放變換時,所有的變換都是針對當(dāng)前的矩陣(與當(dāng)前矩陣相乘),如果需要將當(dāng)前矩陣回復(fù)最初的無變換的矩陣,可以使用單位矩陣(無平移,縮放,旋轉(zhuǎn))。 public abstract void glLoadIdentity()。 在棧中保存當(dāng)前矩陣和從棧中恢復(fù)所存矩陣,可以使用public abstract void glPushMatrix() public abstract void glPopMatrix()。 在進行坐標(biāo)變換的一個好習(xí)慣是在變換前使用glPushMatrix保存當(dāng)前矩陣,完成坐標(biāo)變換操作后,再調(diào)用glPopMatrix恢復(fù)原先的矩陣設(shè)置。 Viewing和Modeling(MODELVIEW) 變換 ndroid OpenGL ES 的GLU包有一個輔助函數(shù)gluLookAt提供一個更直觀的方法來設(shè)置modelview 變換矩陣: void gluLookAt(GL10 gl, float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ)

  • eyex,eyey,eyez 指定觀測點的空間坐標(biāo)。
  • tarx,tary,tarz ,指定被觀測物體的參考點的坐標(biāo)。
  • upx,upy,upz 指定觀測點方向為“上”的向量。(0,1,0)

投影變換Projection

投影變換則對應(yīng)于調(diào)整相機鏡頭遠近來取景。 下面代碼設(shè)置當(dāng)前Matrix模式為Projection投影矩陣: gl.glMatrixMode(GL_PROJECTION); gl.glLoadIdentity(); OpenGL ES可以使用兩種不同的投影變換:透視投影(Perspective Projection)和正側(cè)投影(Orthographic Projection)。Android OpenGL ES提供了一個輔助方法gluPerspective()可以更簡單的來定義一個透視投影變換: GLU.gluPerspective(GL10 gl, float fovy, float aspect, float zNear, float zFar)

  • fovy: 定義視錐的view angle.
  • aspect:  定義視錐的寬高比。
  • zNear: 定義裁剪面的近距離。就是前面距離原點的距離
  • zFar: 定義創(chuàng)建面的遠距離。就是后面距離原點的距離

正側(cè)投影(Orthographic Projection) 正側(cè)投影,它的視錐為一長方體,特點是物體的大小不隨到觀測點的距離而變化,投影后可以保持物體之間的距離和夾角。 定義3D模型的前面和后面下面代碼設(shè)置逆時針方法為面的“前面”:gl.glFrontFace(GL10.GL_CCW); 打開 忽略“后面”設(shè)置:gl.glEnable(GL10.GL_CULL_FACE);然后明確指明“忽略“哪個面的代碼如下: gl.glCullFace(GL10.GL_BACK); FrameBuffer、Depth BufferOpenGL ES 中的FrameBuffer 指的是存儲像素的內(nèi)存空間。對應(yīng)一個二維圖像,如果屏幕分辨率為1280X1024 ,如果屏幕支持24位真彩色 (RGB),則存儲這個屏幕區(qū)域的內(nèi)存至少需要1024X1280X3個字節(jié)。此外如果需要支持透明度(Alpha),則一個像素需要4個字節(jié)。 在最終OpenGL ES寫入這些Buffer時,OpenGL ES提供一些Mask 函數(shù)可以控制Color Buffer 中RGBA通道,是否允許寫入Depth Buffer 等,這些Mask 函數(shù)可以打開或是關(guān)閉某個通道,只有通道打開后,對應(yīng)的分量才會寫入指定Buffer,比如你可以關(guān)閉紅色通道,這樣***寫道Color Buffer中就不含有紅色。 OpenGL ES 中Depth Buffer 保存了像素與觀測點之間的距離信息,在繪制3D圖形時,將只繪制可見的面而不去繪制隱藏的面,這個過程叫”Hidden surface removal” ,采用的算法為”The depth buffer algorithm”。 The depth buffer algorithm 在OpenGL ES 3D繪制的過程中這個算法是自動被采用的,但是了解這個算法有助于理解OpenGL ES 部分API的使用。 下面給出了OpenGL ES中與Depth Buffer相關(guān)的幾個方法:

  • gl.Clear(GL10.GL_DEPTH_BUFFER_BIT) 清空Depth Buffer (賦值為1.0)通常清空Depth Buffer和Color Buffer同時進行。
  • gl.glClearDepthf(float depth) 指定清空Depth Buffer是使用的值,缺省為1.0,通常無需改變這個值,
  • gl.glEnable(GL10.GL_DEPTH_TEST) 打開depth Test
  • gl.glDisable(GL10.GL_DEPTH_TEST) 關(guān)閉depth Test

OpenGL光照模型 為了能看出3D效果,給場景中添加光源。如果沒有光照,繪出的球看上去和一個二維平面上圓沒什么差別 OpenGL 光照模型中最終的光照效果可以分為四個組成部分:Emitted(光源), ambient(環(huán)境光),diffuse(漫射光)和specular(鏡面反射光),最終結(jié)果由這四種光疊加而成。

  • Emitted : 一般只發(fā)光物體或者光源,這種光不受其它光源的影響。 ambient: 環(huán)境光如果射到某個平面,其反射方向為所有方向。Ambient 沒有位置方向,只有顏色。 diffuse:當(dāng)一束平行的入射光線射到粗糙的表面時,因面上凹凸不平,所以入射線雖然互相平行,由于各點的法線方向不一致,造成反射光線向不同 的方向無規(guī)則地反射,這種反射稱之為“漫反射”或“漫射”。這個反射的光則稱為漫射光。漫射光射到某個平面時,其反射方向也為所有方向。diffuse 只依賴于光源的方向和法線的方向。 specular : 一般指物體被光源直射的高亮區(qū)域,也可以成為鏡面反射區(qū),如金屬。specular依賴于光源的方向,法線的方向和視角的方向。 設(shè)置光照效果Set LightingOpenGL ES API如何使用光照效果:
    • 設(shè)置光源
    • 定義法線
    • 設(shè)置物體材料光學(xué)屬性
    光源 OpenGL ES中可以最多同時使用八個光源,分別使用0到7表示。 OpenGL ES光源可以分為
    • 平行光源(Parallel light source), 代表由位于無限遠處均勻發(fā)光體,太陽可以近似控制平行光源。
    • 點光源(Spot light source)  如燈泡就是一個點光源,發(fā)出的光可以指向360度,可以為點光源設(shè)置光衰減屬性(attenuation)或者讓點光源只能射向某個方向(如射燈)。
    下面方法可以打開某個光源,使用光源首先要開光源的總開關(guān):gl.glEnable(GL10.GL_LIGHTING); 然后可以再打開某個光源如0號光源:gl.glEnable(GL10.GL_LIGHT0); 設(shè)置光源方法如下:
    • public void glLightfv(int light,int pname, FloatBuffer params)
    • public void glLightfv(int light,int pname,float[] params,int offset)
    • public void glLightf(int light,int pname,float param)
    • light 指光源的序號,OpenGL ES可以設(shè)置從0到7共八個光源。
    • pname: 光源參數(shù)名稱,可以有如下:GL_SPOT_EXPONENT, GL_SPOT_CUTOFF, GL_CONSTANT_ATTENUATION,  GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION, GL_AMBIENT, GL_DIFFUSE,GL_SPECULAR, GL_SPOT_DIRECTION, GL_POSITION
    • params 參數(shù)的值(數(shù)組或是Buffer類型)。
    其中為光源設(shè)置顏色的參數(shù)類型為上述藍色值,可以分別指定R,G,B,A 的值。 指定光源的位置的參數(shù)為GL_POSITION,值為(x,y,z,w):平行光將w 設(shè)為0.0,(x,y,z)為平行光的方向。 法線 在場景中設(shè)置好光源后,下一步要為所繪制的圖形設(shè)置法線(Normal),只有設(shè)置了法線,光源才能在所會物體上出現(xiàn)光照效果。三維平面的法線是垂直于該平面的三維向量。曲面在某點P處的法線為垂直于該點切平面的向量 打開法線數(shù)組gl.glEnableClientState(GL10.GL_NORMAL_ARRAY); 和設(shè)置顏色類似,有兩個方法可以為平面設(shè)置法線,一是public void glNormal3f(float nx,float ny,float nz) 這個方法為后續(xù)所有平面設(shè)置同樣的方向,直到重新設(shè)置新的法線為止。 為某個頂點設(shè)置法線:public void glNormalPointer(int type,int stride, Buffer pointer)
    • type  為Buffer 的類型,可以為GL_BYTE, GL_SHORT, GL_FIXED,或 GL_FLOAT
    • stride: 每個參數(shù)之間的間隔。
    • pointer: 法線值。
    規(guī)范化法向量,比如使用坐標(biāo)變換(縮放),如果三個方向縮放比例不同的話,頂點或是平面的法線可能就有變化,此時需要打開規(guī)范化法線設(shè)置:gl.glEnable(GL10.GL_NORMALIZE); 經(jīng)過規(guī)范化后法向量為單位向量(長度為1)。同時可以打開縮放法線設(shè)置gl.glEnable(GL10.GL_RESCALE_NORMAL); 設(shè)置物體材料光學(xué)屬性 設(shè)置物體表面材料(Material)的反光屬性(顏色和材質(zhì))的方法如下:         gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, ambient, 0);         gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, diffuse, 0);         gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, specular, 0);           gl.glEnable(GL10.GL_COLOR_MATERIAL);   此外,方法glLightModleXX給出了光照模型的參數(shù) public void glLightModelf(int pname,float param) public void glLightModelfv(int pname,float[] params,int offset) public void glLightModelfv(int pname,FloatBuffer params)
    • pname: 參數(shù)類型,可以為GL_LIGHT_MODEL_AMBIENT和GL_LIGHT_MODEL_TWO_SIDE
    • params: 參數(shù)的值。
    最終頂點的顏色由這些參數(shù)(光源,材質(zhì)光學(xué)屬性,光照模型)綜合決定(光照方程計算出)。
責(zé)任編輯:閆佳明 來源: apkbus
相關(guān)推薦

2014-04-24 11:16:00

OpenGL ES 2入門

2013-09-26 14:09:31

iOS開發(fā)OpenGL ES教程繪制矩形

2014-04-29 14:16:54

2010-02-14 15:27:25

2013-09-26 13:43:13

iOS開發(fā)OpenGL ES教程圖元

2014-04-29 14:05:02

OpenGL ESAndroid添加動作

2017-07-19 15:25:16

iOS開發(fā)ARKitOpen GL

2017-07-04 12:26:14

ARARKit

2014-04-29 14:27:59

OpenGL ES 2Android繪制紋理

2014-04-24 13:26:24

OpenGL ES2.iOSiPhone

2014-04-24 14:00:35

OpenGL ES 2編程

2017-07-06 15:02:53

OpenGL ES架構(gòu)GPU

2014-04-29 13:58:11

OpenGL ESAndroid響應(yīng)觸屏事件

2013-04-26 10:26:08

2014-04-29 14:49:37

OpenGL ES 2Android應(yīng)用投影

2019-05-27 17:01:02

PHPPDO編程語言

2013-09-02 15:46:06

OpenGLWindows

2013-07-05 14:45:05

AndroidOpenGL ES開發(fā)

2011-08-30 15:32:08

QtQuickQML

2009-07-06 14:43:30

JSP元素
點贊
收藏

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

主站蜘蛛池模板: 国产丝袜av | 综合久久综合久久 | 日韩1区2区 | 羞羞视频免费在线 | 亚洲精品乱码久久久久久9色 | 中午字幕在线观看 | 91pao对白在线播放 | 欧美日韩精品综合 | 日韩成人在线看 | 日韩高清一区 | 欧美精品影院 | 婷婷丁香在线视频 | 欧洲一区二区三区 | 日韩免费视频一区二区 | 日韩欧美国产一区二区三区 | 黄色一级免费看 | 99re6在线视频精品免费 | 亚洲激情专区 | 亚洲欧洲一区二区 | 欧美精品1区2区3区 免费黄篇 | 日本韩国电影免费观看 | 国产91丝袜| 日本一区二区三区在线观看 | 精品综合 | 神马久久春色视频 | www.色婷婷 | 国产精品国产三级国产aⅴ原创 | 国产区在线| 国产成人免费视频网站高清观看视频 | 成人精品一区二区 | 国产精品久久久久久久久久久久 | 日韩在线一区二区三区 | 久久精品播放 | 成人精品久久日伦片大全免费 | 亚洲精品视频免费 | 中文字幕加勒比 | 天堂va在线 | 欧美日日 | 国产美女视频黄a视频免费 国产精品福利视频 | 国产精品国产成人国产三级 | 四虎影院在线观看免费视频 |