上篇介紹了最基本的三角形繪制,本篇介紹如何使用索引的方式繪制多邊行。
為什么要使用索引方式,總體來說提高性能。如何提高:使用頂點數組的好處是避免大量的函數調用。即避免每畫一個頂點就調用1次glVertex*()。
另一個好處是避免多邊形相鄰頂點的冗余指定。例如正方體,分別描述6個正方形,會造成每個頂點被重復描述3次。
如果以上沒有說服力,看看這個, gl.Begin(),gl.End()對是一種低效的方式,因此opengl es干脆不再支持他們了,同時高版本的opengl都在棄用gl.Begin(),gl.End()
先了解一些基本的API:
(1)glEnableClientState(枚舉值),參數支持頂點,顏色等等。作用激活選擇的數組,例如:glEnableClientState(GL_VERTEX_ARRAY)表示激活頂點數組
(2)glVertexPointer(size,type,stride,*pointer) size:每個頂點坐標的數量,type 每個坐標的數據類型,stride:連接頂點的之間的偏移值,pointer:頂點數據的指針;作用 :指定頂點數據的數組
與之同類的包括 頂點 法線 紋理等等。
(3)glDrawElements(model,count,type,indices) model:那種類型的圖元(點 線 三角形等),count:數組的元素個數,type:數組中元素的數據類型,indices:存放索引的數組;作用:解引用數組元素的一個列表 我也沒大明白啥意思,用熟了大概就理解了。
(4)glutReshapeFunc(func) 窗口大小發生改變時 會回調func
直接上代碼:
#include "stdafx.h" #include<gl/glut.h> float vertices[] = {-50.0,-50.0, 50.0,-50.0, -50.0,50.0, 50.0,50.0}; GLuint indexs[] = {0,1,2}; void init() { glEnableClientState(GL_VERTEX_ARRAY);//激活頂點數組 glVertexPointer(2,GL_FLOAT,0,vertices); } void renderScene(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDrawElements(GL_TRIANGLES,sizeof(indexs),GL_UNSIGNED_INT,indexs);//以三角形方式繪制 sizeof(indexs)取得數組元素的個數 glutSwapBuffers(); } void Reshape(GLsizei w,GLsizei h) { if(h<0) { h=1; } glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-100,100,-100,100,-100,100); } int _tmain(int argc, _TCHAR* argv[]) { glutInit(&argc, (char**) argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(320,320); glutCreateWindow("Hello OpenGL"); glutDisplayFunc(renderScene); glutReshapeFunc(Reshape); init(); glutMainLoop();//enters the GLUT event processing loop. return 0; }
效果如下:
(5)白色太難看了吧 來給上點色(下面不會再貼全部代碼,貼核心代碼)
float colors[] = {1.0,0.0,0.0,
1.0,0.0,0.0,
1.0,0.0,0.0,
1.0,0.0,0.0};//定義顏色數組
初始化函數里面激活顏色數組 並綁定顏色數組
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3,GL_FLOAT,0,colors);
這不效果出來了:
(6)繪制四邊形,非常easy,只需要改一下數組的索引 GLuint indexs[] = {0,1,2,2,3,1};
下一篇介紹多邊形貼紋理