IntBuffer.wrap(new int[]{...})
在Android2.3中不能像老版本一樣使用IntBuffer.wrap初始化IntBuffer對象(FloatBuffer也一樣),否則系統會拋出異常。應該直接使用allocateDirect方法為緩衝區分配空間,再使用ByteBuffer.put方法將未經處理資料防到緩衝區中。
e.g.
ByteBuffer vbb = ByteBuffer.allocateDirect(VERTS * 3 * 4);
vbb.order(ByteOrder.nativeOrder());
FloatBuffer mFVertexBuffer = vbb.asFloatBuffer();
mFVertexBuffer.put(coords[i*3+j] * 2.0f);
glFrontFace
函數原型
void glFrontFace(GLenum mode);
作用是控制多邊形的正面是如何決定的。在預設情況下,mode是GL_CCW。
mode的值為:
GL_CCW 表示視窗座標上投影多邊形的頂點順序為逆時針方向的表面為正面。
GL_CW 表示頂點順序為順時針方向的表面為正面。
頂點的方向又稱為環繞。
glVertexPointer
函數glVertexPointer的作用是把一數組與圖形的頂點關聯在一起。
參數說明:
void glVertexPointer(GLint size,GLenum type,GLsizei stride,const GLvoid *pointer)
GLint 是int類型
GLenum 是unsigned int類型
GLsizei 是int類型
GLvoid 是void類型
size 指綁定數組後,每個圖形的頂點會用到數組中多少個資料做為頂點的資料
type 規定調用數組的資料時應該用什麼類型。一般與定義的數組的類型是一至的。
stride 規定每個頂點應該從數組中移動的位元組。一般情況下寫0系統會自動識別。識別方式為size*sizeof(數組定義時報類型)
pointer 要綁定數組的地址。
glTexCoordPointer
glTexCoordPointer(int size, int type, int stride, Buffer pointer); 設定頂點數組為紋理座標緩衝
其中: size:紋理頂點座標的分量個數; //size: number of coordinates per vertex;
type:紋理座標的資料類型;short, int, float, double都可以;
stride:位元影像的寬度,可以理解為相鄰的兩個紋理之間跨多少個位元組,一般為0,因為一般不會在紋理中再添加其他的信 息。//stride: offset between 2 consecutive vertices;
pointer:存放紋理座標的數組,指明將繪製的第i個點(i<count)分別對應著貼圖的哪一個角,四個角分別用(0,1)(左上方)、(1,1)(右上方)、(1,0)(右下角)、(0,0)(左下角)表示。如
IntBuffer texCoords = IntBuffer.wrap(new int[]{
0,1,1,1,1,0,0,0,
});
gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, texCoords);
注意:pointer是以頂點數組為參照的,而不是以繪製索引為參照!如
gl.glVertexPointer(3, GL10.GL_FIXED, 0, vertices);
gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, texCoords);
gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 4, GL10.GL_UNSIGNED_BYTE, indices);
poInter以vertices中頂點的順序為參照,而不是indices所指定的順序。
glDrawElements
關於glDrawElements的使用
glDrawElements是一個OPENGL的圖元繪製函數,從數組中獲得資料渲染圖元。
函數原型為:
void glDrawElements( GLenum mode, GLsizei count,
GLenum type, const GLvoid *indices);
其中:
mode指定繪製圖元的類型,它應該是下列值之一,GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_QUAD_STRIP, GL_QUADS, and GL_POLYGON.
count為繪製圖元的數量乘上一個圖元的頂點數。
type為索引值的類型,只能是下列值之一:GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, or GL_UNSIGNED_INT。
indices:指向索引存貯位置的指標。
glCullFace:指定剔出操作的多邊形面
C語言描述
void glCullFace(GLenum mode);
參數
mode 指定應剔除多邊形的哪一個面,不是GL_FRONT就是GL_BACK。
說明
本函數可以禁用多邊形正面或背面上的光照、陰影和顏色計算及操作,消除不必要的渲染計算是因為無論對象如何進行旋轉或變換,都不會看到多邊形的背面。用GL_CULL_FACE參數調用glEnable和glDisable可以啟用或禁用剔除。
http://www.cnblogs.com/yujunyong/archive/2011/04/17/2018776.html
glLoadIdentity()
將當前的使用者座標系的原點移到了螢幕中心:類似於一個複位操作
1.X座標軸從左至右,Y座標軸從下至上,Z座標軸從裡至外。
2.OpenGL螢幕中心的座標值是X和Y軸上的0.0f點。
3.中心左面的座標值是負值,右面是正值。
移向螢幕頂端是正值,移向螢幕底端是負值。
移入螢幕深處是負值,移出螢幕則是正值。
glTranslatef(x, y, z)
沿著 X, Y 和 Z 軸移動。
注意在glTranslatef(x, y, z)中,當您移動的時候,您並不是相對螢幕中心移動,而是相對與當前所在的螢幕位置。其作用就是將你繪點座標的原點在當前原點的基礎上平移一個(x,y,z)向量。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
glLoadIdentity();
glTranslatef(-1.5f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f, 0.0f);
glVertex3f(1.0f,0.0f, 0.0f);
glVertex3f(0.0f,1.0f, 0.0f);
glEnd();
glLoadIdentity();
glTranslatef(0.0f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f, 0.0f);
glVertex3f(1.0f,0.0f, 0.0f);
glVertex3f(0.0f,1.0f, 0.0f);
glEnd();
/////////////////////////////////////////////////////////////////////////////////////
程式的運行結果如下:
左邊的三角形是第一步繪製的,可以看到該三角形繪製的座標系,實際上是以(-1.5f,0.0f,-6.0f)為原點的。
第二個三角形繪製的時候,由於使用glLoadIdentity()使原點重新回到螢幕中心來,因此其原點位於螢幕的中心。
glRotatef(angle, x, y, z)
與glTranslatef(x, y, z)類似,glRotatef(angle, x, y, z)也是對座標系進行操作。
旋轉軸經過原點,方向為(x,y,z),旋轉角度為angle,方向滿足右手定則。
////////////////////////////////////////////////////////////////
glLoadIdentity();
glTranslatef(0.0f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f, 0.0f);
glVertex3f(1.0f,0.0f, 0.0f);
glVertex3f(0.0f,1.0f, 0.0f);
glEnd();
////////////////////////////////////////////////////////////////
在未旋轉的情況下:
////////////////////////////////////////////////////////////////
glLoadIdentity();
glRotatef(45,0.0f,0.0f,1.0f);
glTranslatef(0.0f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f, 0.0f);
glVertex3f(1.0f,0.0f, 0.0f);
glVertex3f(0.0f,1.0f, 0.0f);
glEnd();
////////////////////////////////////////////////////////////////
繞Z軸正向旋轉45度角,因為Z軸正方向由螢幕內指向螢幕外,由右手定則可知方向為逆時針轉動。
由於直角頂點即為原點,因此將圍繞直角逆時針旋轉。
旋轉和平移函數都存在的情況下,程式會如何執行呢?只有平移的情況://////////////////////////////////////////////////////////////// glLoadIdentity(); // Reset The Current Modelview Matrix
glTranslatef(0.0f, 0.0f, -6.0f);
glBegin(GL_QUADS);
glVertex3f(-0.01f,-0.01f, 0.0f);
glVertex3f( 0.01f,-0.01f, 0.0f);
glVertex3f( 0.01f, 0.01f, 0.0f);
glVertex3f(-0.01f, 0.01f, 0.0f);
glEnd();
glLoadIdentity();
// glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
glTranslatef(1.0f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f, 0.0f);
glVertex3f(1.0f,0.0f, 0.0f);
glVertex3f(0.0f,1.0f, 0.0f);
glEnd();////////////////////////////////////////////////////////////////加上旋轉的情況://////////////////////////////////glLoadIdentity(); // Reset The Current Modelview Matrix
glTranslatef(0.0f, 0.0f, -6.0f);
glBegin(GL_QUADS);
glVertex3f(-0.01f,-0.01f, 0.0f);
glVertex3f( 0.01f,-0.01f, 0.0f);
glVertex3f( 0.01f, 0.01f, 0.0f);
glVertex3f(-0.01f, 0.01f, 0.0f);
glEnd();
glLoadIdentity();
glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
glTranslatef(1.0f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f, 0.0f);
glVertex3f(1.0f,0.0f, 0.0f);
glVertex3f(0.0f,1.0f, 0.0f);
glEnd();/////////////////////////////////如果旋轉和平移語句的順序調換一下結果會怎麼樣呢?///////////////////////////glLoadIdentity(); // Reset The Current Modelview Matrix
glTranslatef(0.0f, 0.0f, -6.0f);
glBegin(GL_QUADS);
glVertex3f(-0.01f,-0.01f, 0.0f);
glVertex3f( 0.01f,-0.01f, 0.0f);
glVertex3f( 0.01f, 0.01f, 0.0f);
glVertex3f(-0.01f, 0.01f, 0.0f);
glEnd();
glLoadIdentity();
glTranslatef(1.0f,0.0f,-6.0f);
glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f, 0.0f);
glVertex3f(1.0f,0.0f, 0.0f);
glVertex3f(0.0f,1.0f, 0.0f);
glEnd();//////////////////////////由這三個例子可知,所有對圖形進行平移旋轉等操作的語句的執行順序都是從下到上執行的。而且旋轉語句的旋轉中心知(0.0f, 0.0f, 0.0f)這個點。
////////////////////////////////////////////////////////////////
glLoadIdentity();
glRotatef(45,0.0f,0.0f,1.0f);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f, 0.0f);
glVertex3f(1.0f,0.0f, 0.0f);
glVertex3f(0.0f,1.0f, 0.0f);
glEnd();
////////////////////////////////////////////////////////////////
在旋轉之後加了一個複位的指令,圖形就不會旋轉了。