簡述
OpenGL繪製方式
OpenGL可以支持很多不同的圖元類型,最基礎的爲點,線,或三角形。線和三角形可以組合成條帶,循環體或者扇面三角形。點,線,或三角形也是大部分圖象硬件設備支持的基礎圖元類型。
點繪製
點可以通過單一的頂點來表示,點實際上不存在面積,在OpenGL中它通過屏幕上的一個矩形區域來模擬,在渲染點源的時候,OpenGL會通過光柵化規則類判斷點的位置。以點位中心繪製一個四邊形區域,四邊形區域的邊長等於點的大小,它是一個固定的狀態,可以調用函數glPointSIze()設置。
voidglPointSIze(GLfloat size); 設置固定像素大小,如果沒有開啓GL_PROGRAM_POINT_SIZE,那麼默認用於設置點的大小 |
OPenGL渲染點的時候,每個點的片元的會執行片元着色器,在本質上都是屏幕上的方形區域,而每個像素都可以使用不同的顏色來着色。OPenGL的片元着色器提供了一種特殊的內置變量來完成,叫gl_PointCoord,其中包含了當前片元在點區域內的座標信息,它只能在片元着色器中工作,它的值只對點的渲染遊戲
線,條帶與循環線
OpenGL中的線表示一條線段,一個線可以通過兩個頂點來表達,多段線可以使用多個線段鏈接來表示,首尾閉合的多段線叫循環線,線的寬度可以由glLineWidth()來設置
voidglLineWidth(GLfloat width); width表示線的寬度,默認值位1.0,它必須是一個大於0.0的值,否則會報錯 |
三角形,條帶和扇面
三角形的方式繪製時每個三角形之間都是互相獨立的,如果以三角形的方式繪製一個矩形那麼需要繪製兩個三角形,提供6個頂點。
條帶繪製需要4個頂點,前三個頂點構成第一個三角形,後繼的頂點將與之前三角形的後兩個頂點一起構成新的三角形。
扇面繪製的時候,第一個頂點會作爲一個共享點存在,它作爲每一個後繼三角形的組成部分,之後的每兩個頂點都會與這個共享點組成新的三角形。
繪製方式和OpenGL枚舉對應關係
圖元類型 |
OpenGL枚舉量 |
點 |
GL_POINTS |
線 |
GL_LINES |
條帶線 |
GL_LINE_STRIP |
循環線 |
GL_LINE_LOOP |
獨立三角形 |
GL_TRIANGLES |
三角形條帶 |
GL_TRIANGLE_STRIP |
三角形扇面 |
GL_TRIANGLE_FAN |
繪製方式實例
先構建一個頂點數組
float points[] = {
-0.6f, 0.2f, 1.0f, 0.0f, 1.0f,
-0.6f, -0.2f, 1.0f, 1.0f, 1.0f,
-0.2f, 0.2f, 0.0f, 0.0f, 1.0f,
-0.2f, -0.2f, 1.0f, 0.0f, 0.0f,
0.2f, 0.2f, 0.0f, 0.0f, 1.0f,
0.2f, -0.2f, 0.0f, 1.0f, 0.0f,
};
在空間中的分佈位置及順序
點繪製
設置點的大小
glPointSize(5);
glDrawArrays(GL_POINTS, 0, 6);
效果
線段繪製
設置線段的寬
glLineWidth(10);
glDrawArrays(GL_LINES, 0, 6);
效果
多線段繪製
glDrawArrays(GL_LINES, 0, 6);
效果
循環線繪製
glDrawArrays(GL_LINE_LOOP, 0, 6);
效果
獨立三角形繪製
一共六個頂點,相當於繪製了兩個三角形
glDrawArrays(GL_TRIANGLES, 0, 6);
效果
三角形條帶繪製
繪製了六個三角形,組成了一個矩形
繪製
glDrawArrays(GL_TRIANGLE_STRIP0, 6);
效果
三角扇面繪製
以第一個點爲共享點,和後續的點組成三角形。
重新構建頂點數組
float points[] = {
0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.4f, 0.0f, 0.0f, 1.0f, 0.0f,
0.346f, 0.2f, 0.0f, 0.0f, 1.0f,
0.2f, 0.346f, 0.0f, 0.0f, 1.0f,
0.0f, 0.4f, 1.0f, 0.0f, 1.0f,
-0.2f, 0.346f, 1.0f, 1.0f, 1.0f,
};
在空間中的分佈位置及順序
繪製
glDrawArrays(GL_TRIANGLE_FAN, 0, 6);
效果
多邊形渲染模式
可以將多邊形渲染爲點集,輪廓線或填充。
可以調用glPolygonMode()函數進行設置
voidglPolygonMode(GLenum face, GLenum mode); 參數:face必須設爲GL_FRONT_AND_BACK mode 可以設置爲GL_POINT,GL_LINE,GL_FILL,分別對應點集,輪廓線,填充 |
以上面的扇形爲例
點集效果
glPolygonMode(GL_FRONT_AND_BACK ,GL_POINT);
輪廓線效果
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
填充效果
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
參見:《OpenGL編程指南》第八版第3章