OpenGL學習04 直線 三角形繪製

2021-06-27 13:05:46 字數 3854 閱讀 2993

一、畫線

(1)在glbegin中使用gl_lines繪製圖元時,每兩個頂點會連成一條直線,例如:

glbegin(gl_lines);

glvertex3f(20.0f, 0.0f, 0.0f);

glvertex3f(50.0f, 50.0f, 0.0f);

glvertex3f(-50.0f, 50.0f, 0.0f);

glvertex3f(-20.0f, 00.0f, 0.0f);

glend();

執行結果,如下圖所示:

圖1

注意:這裡用的兩個頂點指定乙個圖元。每兩個指定的頂點用於繪製一條直線。如果指定的頂點為奇數個,那麼最後乙個頂點會被忽略掉。

(2)在glbegin中使用gl_line_strip繪製圖元時,會繪製一條經過所有頂點的連續的線,例如:

glbegin(gl_line_strip);

glvertex3f(20.0f, 0.0f, 0.0f);

glvertex3f(50.0f, 50.0f, 0.0f);

glvertex3f(-50.0f, 50.0f, 0.0f);

glvertex3f(-20.0f, 00.0f, 0.0f);

glend();

執行結果,如下圖所示:

圖2

(3)在glbegin中使用gl_line_loop繪製圖元時,繪製圖形的方式gl_line_strip類似,只是最後乙個頂點會和第乙個頂點連成一條直線,例如:

glbegin(gl_line_loop);

glvertex3f(20.0f, 0.0f, 0.0f);

glvertex3f(50.0f, 50.0f, 0.0f);

glvertex3f(-50.0f, 50.0f, 0.0f);

glvertex3f(-20.0f, 00.0f, 0.0f);

glend();

執行結果,如下圖所示:

圖3

(4)直線寬度

當我們繪製直線是可以使用gllinewidth函式設定直線的寬度:

void apientry gllinewidth (glfloat width);
gllinewidth函式接受乙個引數,用於指定直線的寬度(以畫素為單位)。直線的寬度值的受到限制,確保自己設定直線寬度值有效,可使用一下獲取直線寬度的範圍值:

glfloat sizes[2];

glfloat step;

glgetfloatv(gl_line_width_range, sizes);

glgetfloatv(gl_line_width_granularity, &step);

其中,sizes第乙個位元組為直線寬度最小值,第二個位元組為直線寬度的最大值;step為直線寬度允許的最小增量;

(4)繪製虛線

同樣的我們可以使用繪製直線的繪製虛線,稱為「點畫(stippling)」;需要使用下面**開啟點畫功能

glenable(gl_line_stipple);
然後使用gllinestipple函式建立這種模式以便進行畫線

void gllinestipple (glint factor, glushort pattern);
pattern引數是乙個16位的值,它指定了乙個模式,供繪製直線使用。它的每一位都表示線段的一部分或者開啟狀態,或者處於關閉狀態。預設情況下,每位對應乙個畫素,但是factor引數可以作為乘法因子增加模式的寬度。

二、三角形

(1)在glbegin中使用gl_********s繪製圖元時,每三個頂點會組成乙個三角形,例如:

glbegin(gl_********s);

glvertex2f(0.0f, 0.0f);

glvertex2f(25.0f, 25.0f);

glvertex2f(50.0f, 0.0f);

glvertex2f(-50.0f, 0.0f);

glvertex2f(-75.0f, 50.0f);

glvertex2f(-25.0f, 0.0f);

glend();

執行結果,如下圖所示:

圖4

注意:這裡用的三個個頂點指定乙個圖元。每三個指定的頂點用於繪製乙個三角形。如果指定的頂點不是3的倍數,那麼最後乙個頂點或兩個頂點會被忽略掉。

(2)環繞

頂點的指定次序以及方向的組合被稱為環繞(winding)。如下圖三角形被認為具有順時針方向的環繞,因為他們都是按照順時針的方向進行繪製的。

圖5,來至opengl超級寶典

如果我們在左邊的三角形上反正v4和v6的位置,就將得到乙個逆時針的環繞,如下圖:

圖6,來至opengl超級寶典

在預設情況下,opengl認為逆時針方向環繞的一面是多邊形的正面。這意味著圖6中左側三角形顯示是正面,而右側三角形顯示的是背面。

這是乙個非常重要的問題。我們常常希望乙個多邊形的正面和背面分別設定不同的物理特徵。我們可以隱藏乙個多邊形的背面(效率問題),或則給他設定一種不同的顏色和反色屬性。

(2)三角形帶

對於許多表面和形狀,可能需要繪製幾個相連的三角形。使用gl_********_strip圖元,可以繪製一串相連線的三角形,從而節省大量的時間。圖7顯示了由5個頂點所指定的3個三角形的繪製過程。由圖7可以看出這些頂點並不是按照他們的指定順序進行遍歷的,這是為了保持每個三角形的環繞方式(逆時針)。他們的繪製模式是v0、v1、v2,接著是v2、v1、v3,然後是v2、v3、v4,接下來由此類推。

圖7,來至opengl超級寶典

(3)三角形扇

可以使用gl_********_fan建立一組圍繞乙個中心點的相連的三角形。如圖8顯示通過四個頂點所產生的包括三個三角形的三角扇。用前3個頂點指定第乙個三角形後,後續的每個頂點和遠點v0以及前驅的那個頂點vn-1形成了接下來的三角形。

圖8,來至opengl超級寶典

OpenGL畫三角形

修改paintgl函式 void nehewidget paintgl 清楚螢幕和深度快取 glclear gl color buffer bit gl depth buffer bit 重置當前的模型觀察矩陣 glloadidentity gltranslatef 1.5,0.0,6.0 開始繪製...

OpenGL畫三角形

修改paintgl函式 void nehewidget paintgl 清楚螢幕和深度快取 glclear gl color buffer bit gl depth buffer bit 重置當前的模型觀察矩陣 glloadidentity gltranslatef 1.5,0.0,6.0 開始繪製...

OpenGL隨筆二 opengl繪製三角形

define glew static 1 include include include vbo繪製兩個共邊的三角形需要六個點 float vertices const char vertexshadersource version 330 core n layout location 0 in v...