glLoadIdentity和glMultMatrix
?
? ? glLoadIdentity的作用是將當前模型視圖矩陣轉換為單位矩陣(行數和列數相同的矩陣,并且矩陣的左上角至右下角的連線上的元素都為1,其它元素都為0),這樣可以方便矩陣的乘法運算。
??????? glMultMatrix矩陣的乘法.
??????? 如:
glLoadIdentity();glMultiMatrix(A);glMultiMatrix(B);glMultiMatrix(C);
?
針對行向量和當前矩陣,上述代碼可等價于:
(vx vy vz 1) *C*B*A
結果是一個1行4列的矩陣。
?
你可能會奇怪,為什么程序和實際矩陣的運算順序是相反的呢。可以這么想像一下,glMultiMatrix先將矩陣加入到一個棧中保存,當所有的glMultiMatrix操作都完成后,再依次從棧中將緩存的矩陣取出并做相應的乘法操作。由于棧結構是先進后出的數據結構,所以可以猜想glMultiMatrix在執行時并沒有直接將矩陣進行計算,而是先將矩陣放在了棧緩存中。
OpenGL ES 模型視圖之縮放操作?
?
對當前模型視圖進行縮放,在OpenGL ES 1.0中可以使用glScale*函數,而在2.0中需要自己設置縮放矩陣。
?????? 如,分別使用sx,sy,sz表示在x,y,z軸上的縮放比例,那么在1.0中可以這樣縮放模型視圖:
glScalef(sx, sy, sz);
?????? 在2.0中你需要這么做:
float scale[16] = {sx, 0, 0, 0,0, sy, 0, 0,0, 0, sz, 0,0, 0, 0, 1 };glMultiMatrixf(scale);
?????? 縮放矩陣的推導過程如下:
vS = (vx vy vz 1)?= (vx*sx vy*sy vz*sz 1*1) = v '
?
OpenGL ES 模型視圖之平移操作
? ?對當前模型視圖進行平移操作,在OpenGL ES 1.0中可以使用glTranslate*函數,而在2.0中需要自己設置平移矩陣。
?????? 如,分別使用tx,ty,tz表示在x,y,z軸上的移動距離,那么在1.0中可以這樣平移模型視圖:
glTranslatef(tx, ty, tz);
?????? 在2.0中你需要這么做:
float translation[16] = {1, 0, 0, 0,0, 1, 0, 0,0, 0, 1, 0,tx, ty, tz, 1 };glMultiMatrixf(translation);
?????? 平移矩陣的推導過程如下:
vT = (vx vy vz 1)?= (vx+tx? vy+ty? vz+tz 1*1) = v '
??OpenGL ES之glRotate函數?????????????????????????
glRotate—— 使用一個旋轉矩陣乘以當前矩陣
函數原型:
void glRotatef(GLfloat angle,? GLfloat x,? GLfloat y,? GLfloat z);?
void glRotatex(GLfixed angle,? GLfixed x,? GLfixed y,? GLfixed z);
函數參數:
angle? 指定旋轉角度,單位為度。
x, y, z ?? 指定一個向量的? x, y, z 坐標
描述:
glRotate產生一個圍繞vector(x,y,x),角度為angle的旋轉操作。旋轉矩陣乘以當前矩陣的積,將代替當前矩陣,當glMultMatrix以如下參數被調用時:
其中,c = cos(angle),s = sin(angle),并且||(x, y, z)|| = 1(如果不是,OpenGL ES會標準化它)。
如果矩陣模式設為GL_MODELVIEW 或 GL_PROJECTION,那么在glRotate后面繪制的所有對象都將被旋轉。使用 glPushMatrix 或 glPopMatrix來保存或恢復縮放前的坐標系統。
注意:
旋轉遵循右手規則,如果向量(x,y,z)點正對著用戶的話,旋轉是逆時針的。
???
OpenGL ES之glPushMatrix, glPopMatrix函數
glPushMatrix, glPopMatrix—— 壓入和彈出矩陣棧
void glPushMatrix(void);?
void glPopMatrix(void);
描述:
對于每一種矩陣模式都有一個矩陣棧。對于GL_MODELVIEW,棧的深度最少為16。對于GL_PROJECTION和GL_TEXTURE,棧的深度最少為2。任何模式的當前矩陣都是指該模式的矩陣棧頂的那個矩陣。
glPushMatrix 復制當前矩陣并將其加入棧中,此時它處于棧頂位置。
glPopMatrix?? 彈出當前矩陣棧,當前矩陣被彈出,之前處在其下的那個矩陣將變為棧頂。
默認的,每個棧都包含一個矩陣,唯一標識的矩陣。
向已經填滿的棧壓入矩陣或從僅有一個矩陣的棧中彈出矩陣都會引起錯誤。
注意:
每一個紋理單元都有自己的紋理矩陣棧,使用glActiveTexture選擇想要的那個紋理矩陣棧。
?????OpenGL ES之glFrustum函數
?
glFrustum—— 使用一個透視矩陣乘以當前矩陣
函數原型:
void glFrustumf(GLfloat left,? GLfloat right,? GLfloat bottom,? GLfloat top,? GLfloat near,? GLfloat far);
void glFrustumx(GLfixed left,? GLfixed right,? GLfixed bottom,? GLfixed top,? GLfixed near,? GLfixed far);
?
函數參數:
left,right???????? 指定左邊和右邊垂直切面的坐標bottom,top??? 指定下邊和上邊水平切面的坐標
near,far???????? 指定近端和遠端深度切面的距離
描述:
glFrustum描述了一個產生透視投影的透視矩陣。這個矩陣乘以當前矩陣的積,將代替當前矩陣,當glMultMatrix以如下參數被調用時:
通常,矩陣模式是GL_PROJECTION, 假設眼睛的位置在(0,0,0), (left, bottom, -near) 和 (right, top,? -near)指明了近切面的點,并且被映射到窗口的左下角和右上角。-far指明了遠切面的位置。near 和 far都必須是正數
使用 glPushMatrix 或 glPopMatrix來保存或恢復縮放前的坐標系統。
注意:
深度緩沖區的精度受到指定的near和far值的影響。far和near的比例越大,區分臨近表面的有效深度緩沖區就越少。如果,
那么,將有大概
位的深度緩沖區精度被丟失。因為,當near接近0的時候,r就接近于無窮,所以near一定不要設置為0.
錯誤:
GL_INVALID_VALUE???????? 如果near和far不為整數,left等于right,top等于bottom,near等于far,那么將產生GL_INVALID_VALUE錯誤。
?
OpenGL ES之glOrtho函數
glOrtho—— 使用一個正交矩陣乘以當前矩陣?
函數原型:
void glOrthof(GLfloat left,? GLfloat right,? GLfloat bottom,? GLfloat top,? GLfloat near,? GLfloat far);
void glOrthox(GLfixed left,? GLfixed right,? GLfixed bottom,? GLfixed top,? GLfixed near,? GLfixed far);
函數參數:
left,right???????? 指定左邊和右邊垂直切面的坐標bottom,top??? 指定下邊和上邊水平切面的坐標
near,far???????? 指定近端和遠端深度切面的距離,如果面在觀察者后面,這兩個值都要為負數。
描述:
glOrtho描述了一個產生平行投影的變換。這個矩陣乘以當前矩陣的積,將代替當前矩陣,當glMultMatrix以如下參數被調用時:
通常,矩陣模式是GL_PROJECTION, 假設眼睛的位置在(0,0,0), (left, bottom, -near) 和 (right, top,? -near)指明了近切面的點,并且被映射到窗口的左下角和右上角。-far指明了遠切面的位置。near 和 far可以是正數或負數。
使用 glPushMatrix 或 glPopMatrix來保存或恢復縮放前的坐標系統。
錯誤:
GL_INVALID_VALUE???????? 如果left等于right,top等于bottom,near等于far,那么將產生GL_INVALID_VALUE錯誤。
OpenGL ES之glOrtho和glFrustum的區別
?
?glOrtho和glFrustum的參數是一樣的,但是glFrustum的near和far參數都必須是整數并且near不能為0,而glOrtho的near和far參數沒有這個限制。二者的left, right, bottom, top表達的意思是相同的,都是指某一切面的坐標位置。
??????? glOrtho表達的是正交矩陣,效果是2D的,就像你正對著一個立方體的某一個面看,所以它沒有“近大遠小”的效果。
??????? glFrustum表達的是透視矩陣,效果是3D的,它是一個平頭錐體,具有“近大遠小”的效果。
??????? 所以,如果你要繪制2D效果,可以使用glOrtho,要繪制3D效果,使用glFrustum。由于計算3D需要復雜的計算,所以要開啟深度測試。
CGBitmapContextCreate函數參數詳解
函數原型:
當你調用這個函數的時候,Quartz創建一個位圖繪制環境,也就是位圖上下文。當你向上下文中繪制信息時,Quartz把你要繪制的信息作為位圖數據繪制到指定的內存塊。一個新的位圖上下文的像素格式由三個參數決定:每個組件的位數,顏色空間,alpha選項。alpha值決定了繪制像素的透明性。
CGContextRef CGBitmapContextCreate (
?? void *data, ??? 指向要渲染的繪制內存的地址。這個內存塊的大小至少是(bytesPerRow*height)個字節
?? size_t width, ? ??bitmap的寬度,單位為像素
?? size_t height, ? ?? bitmap的高度,單位為像素
?? size_t bitsPerComponent, ???內存中像素的每個組件的位數.例如,對于32位像素格式和RGB 顏色空間,你應該將這個值設為8
?? size_t bytesPerRow, ? ? ? ? ? ??bitmap的每一行在內存所占的比特數
?? CGColorSpaceRef colorspace, ???bitmap上下文使用的顏色空間。
?? CGBitmapInfo bitmapInfo ? ? ? ?指定bitmap是否包含alpha通道,像素中alpha通道的相對位置,像素組件是整形還是浮點型等信息的字符串。);
OpenGL ES之glTexImage2D函數
glTexImage2D—— 指定一個二維的紋理圖片
紋理映射一個指定的紋理圖像的每一部分到相應的圖元中。調用帶GL_TEXTURE_2D參數的glEnable和glDisable函數來啟用和禁止二維材質貼圖。默認,二維材質貼圖是禁用的。
調用glTexImage2D來定義材質圖片
函數原型:
void glTexImage2D(GLenum target, ?指定目標紋理,這個值必須是GL_TEXTURE_2DGLint level, ?執行細節級別。0是最基本的圖像級別,你表示第N級貼圖細化級別。GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels);
函數參數:
target???? 指定目標紋理,這個值必須是GL_TEXTURE_2D。
level?????? 執行細節級別。0是最基本的圖像級別,你表示第N級貼圖細化級別。
internalformat???? 指定紋理中的顏色組件,這個取值和后面的format取值必須相同。可選的值有
??????????????????? GL_ALPHA,
??????????????????? GL_RGB,
??????????????????? GL_RGBA,
??????????????????? GL_LUMINANCE,?
??????????????????? GL_LUMINANCE_ALPHA 等幾種。width???? 指定紋理圖像的寬度,必須是2的n次方。紋理圖片至少要支持64個材質元素的寬度
height???? 指定紋理圖像的高度,必須是2的m次方。紋理圖片至少要支持64個材質元素的高度
border??? 指定邊框的寬度。必須為0。
format??? 像素數據的顏色格式,必須和internalformatt取值必須相同。可選的值有
??????????????????? GL_ALPHA,
type??????? 指定像素數據的數據類型。可以使用的值有????????????????????
??????????????????? GL_RGB,
??????????????????? GL_RGBA,
??????????????????? GL_LUMINANCE,?
??????????????????? GL_LUMINANCE_ALPHA 等幾種。??????????????????? GL_UNSIGNED_BYTE,
??????????????????? GL_UNSIGNED_SHORT_5_6_5,
??????????????????? GL_UNSIGNED_SHORT_4_4_4_4,?
??????????????????? GL_UNSIGNED_SHORT_5_5_5_1pixels????? 指定內存中指向圖像數據的指針
?
?
?
OpenGL ES之glShadeModel函數
glShadeModel—— 選擇flat或smooth著色
函數原型:
void glShadeModel(GLenum mode)
函數參數:
mode?? 指明使用哪種著色技術,可以取值GL_FLAT和GL_SMOOTH。默認取值是GL_SMOOTH(顏色漸變)。
描述:
原文翻譯太復雜,我在這里總結一下:在使用頂點數據繪制幾何圖形時,如果為每個頂點指定了頂點顏色,此時若使用GL_SMOOTH,每個頂點使用對應的頂點顏色來著色,而頂點之間的片元顏色則使用差值的方式來計算獲得,結果就是漸變色;而若使用GL_FLAT,假設幾何圖形由n個三角形構成,則只會使用頂點顏色數組中最后n個顏色進行著色。
?
GL_SMOOTH著色模式
?
GL_FLAT著色模式