OpenGL繪製方式詳解

簡述

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章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章