基本圖元
截屏2020-07-13 17.55.48.png
- 這些圖元將在一個包含給定圖元的所有頂點和相關(guān)屬性的單個批次中進行渲染
- 本質(zhì):在一個給定的批次中的所有定點都會用于組成這些圖元中的一個
基本圖元事例
2500437-13ab305aadd4e3d2.png
點
- 最簡單的圖元塔逃,每個特定的頂點在屏幕上都僅僅是一個單獨的點
- 默認情況下僵驰,點的大小為一個像素
- 可以調(diào)用以下方法改變默認點點大小
void glPointSize(GLfloat size)
注意:并不是所有的點的大小都能夠支持的疯坤,應(yīng)該先確認指定點大小是否可用(用以下函數(shù)獲得點大小的范圍及它們之間的最小間隔)
GLfloat sizes[2];//存儲支持的點大小范圍
GLfloat step;//存儲支持的點大小增量
//獲取支持的點大小范圍和步長(增量)
glGetFloatv(GL_POINT_SIZE_RANCE,sizes);
glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);
線
- 比點更進一步的獨立的線段
- 在二個頂點之間繪制的包含偶數(shù)個頂點的一批線段且每個頂點都是線段的端點
- 默認線段的寬度為一個像素
- 改變線段寬度的函數(shù)(唯一方式)
void glLineWidth(GLfloat width);
注意:
- 線帶:連續(xù)地從一個頂點到下一個頂點繪制線段诡渴,以形成一個真正連接點的線條(GL_LINE_STRIP)
- 線環(huán):是線帶的一種簡單擴展,在線帶的基礎(chǔ)上額外增加了一條連接著一批次中最后一個點和第一個點的線段(GL_LINE_LOOP)
三角形
- 可能是存在最簡單的實體多邊形(只有三個邊)
- 光柵化硬件最歡迎三角形(OpenGL中支持的唯一一種多邊形)
單獨的三角形
1.png
環(huán)繞
- 如上圖所示:連接頂點的線段上所示的箭頭,無論左右三角形都是按照頂點被指定的順序(順時針或逆時針)
- 環(huán)繞:即這種順序與方向結(jié)合來指定頂點的方式(順時針環(huán)繞或逆時針環(huán)繞)
2.png
注意:
- 默認情況:OpenGL認為具有逆時針方向環(huán)繞的多邊形為正面的(順時針方向環(huán)繞:反面)
- 對一個多邊形的正反面需要設(shè)置不同的物理特征(顏色,反射,紋理)
- 在一個場景中名秀,使所有的多邊形保持環(huán)繞方向的一致,并使用正面多邊形來繪制所有實心物體的外表面是非常重要的
//此函數(shù)可以改變以上的默認行為
glFrontFace(GL_CW);
GL_CW(此參數(shù)告訴OpenGL順時針環(huán)繞的多邊形將被認為是正面)
GL_CCW(此參數(shù)把多邊形的正面重新恢復(fù)為逆時針環(huán)繞)
三角形帶
- 對于許多表面和形狀來說藕溅,我們可能需要繪制幾個相連的三角形匕得。可以使用GL_TRIANGLE_STRIP圖元繪制一串相連的三家形巾表,從而節(jié)省大量的時間
3.png
思考:為什么使用三角形帶而不分別指定每個三角形汁掠?
優(yōu)點1:用前三個頂點指定第一個三角形之后,對于接下來的每個三角形集币,只需要再指定一個頂點(尤其是需要繪制大量的三角形時考阱,采用這種方法可以節(jié)省大量的程序代碼和數(shù)據(jù)存儲空間)
優(yōu)點2:提高運算性能和節(jié)省帶寬(更少的頂點意味著數(shù)據(jù)從內(nèi)存?zhèn)鬏數(shù)綀D形卡的速度更快,頂點著色器需要進行處理的次數(shù)也更少)
三角形扇
- 可以使用GL_TRIANGLE_FAN創(chuàng)建一組圍繞一個中心點點相連三角形
4.png
簡單批次容器
- GLTools庫中包含一個簡單的容器類鞠苟,叫GLBatch
- GLBatch以供7種基本圖元簡單批次的容器使用乞榨,且它知道在使用GLShaderManager支持的任意存儲著色器時如何對圖元進行渲染的
注意:
OpenGL內(nèi)部運行機制實際上比這要復(fù)雜得多(GLBatch類只是一個便利類)
GLTools使用
1.對批次進行初始化
//包含那種類型圖元,頂點數(shù)当娱,(可選)一組或二組紋理坐標
void GLBatch::Begin(GLenum primitive, GLuint nVerts, GLuint nTextureUnits = 0);
2.至少要復(fù)制一個由3個分量(x,y,z)頂點組成的數(shù)組
void GLBatch::CopyVertexData3f(GLfloat *vVerts);
//也可以復(fù)制表面法線吃既,顏色和紋理坐標
void GLBatch::CopyNormalDataf(GLfloat *vNorms);
void GLBatch::CopyColorData4f(GLfloat *vColors);
void GLBatch::CopyTexCoordData2f(GLfloat *vTex, GLuint uiTextureLayer);
3.最后結(jié)束
void GLBatch::Draw(void);