除了直線的寬度可以根據需要進行改變外,直線的線型也可以改變。gllinestipple就可以提供不同於常規的連續線段的中心線、虛線、點劃線等等。其函式原型如下
void gllinestipple(
glintfactor
,
glushortpattern
);其中
factor
factor為3
,那麼線型模式中的每一位要重複
3次,然後在繼續下一位。
factor
的取值範圍是
[1, 256]
,預設值是1。
pattern
是乙個16
位的整數,它表示線型模式,當某一位為
0時,表示不畫線,為
1時畫線,但是處理是從最底位開始的,顏色為當前顏色。預設值為
0xffff
,即連續線。
例如pattern
為0x40ff
時,表示的畫線如下圖
10-3
所示。
禁用和啟用線型模式設定可以使用glenable(gl_line_stipple) 和gldisable(
gl_line_stipple),
當禁用線型模式時,使用gllinestipple設定的直線均按照連續線處理,這也是opengl的預設處理。
下面我們來舉例說明常用的幾種直線線型的構造和使用。
bool bantialiasing = false;//
是否進行反走樣處理
bool bantipress = false;//
是否按了f1鍵
void line3f(glfloat, glfloat, glfloat, glfloat, glfloat, glfloat);
int patternmode = 0;//
線型模式
int pattern=//
定義了6種線型;
為了更換各種線型,增加了按鍵選擇,**在wndproc()裡面。
lresult callback wndproc(hwnd hwnd, uint message, wparam wparam, lparam lparam)
else
return 0;
}//
監視視窗啟用訊息
case wm_size:
case wm_keydown:
switch(wparam)
break;
case wm_destroy:
postquitmessage(0);
break;
default:
return defwindowproc(hwnd, message, wparam, lparam); }
return 0; }
glinit()基本沒有特殊的處理,下面是glmain()的具體實現。
void glmain()
else if(!bantialiasing && bantipress)
//縮放因子為2,看起來效果明顯一些
gllinestipple(2, pattern[patternmode]);
for(alpha = 0; alpha<360; alpha+=10)
angle+=0.5;
swapbuffers(g_hdc); }
其中line3f是乙個自定義函式,其功能就是繪製一條三維直線。
void line3f(glfloat fromx, glfloat fromy, glfloat fromz,
glfloat tox, glfloat toy, glfloat toz)
程式執行後,可以看到乙個由點線構成的圓柱面圍繞y軸旋轉。按空格鍵後線型改變,不停的按空格鍵,線型將會一直迴圈改變,重複6種線型。按f1鍵後,所有的線型均以反走樣形式出現。效果如圖10-4所示。由於反走樣處理需要額外的資源開銷,反走樣處理後程式的執行速度有所下降。
OpenGL系統設計 擴充套件建模 6
和曲線類似,曲面也可以通過控制點來模擬。實際上在很多場合也使用多邊形來模擬平滑曲面,但使用控制點需要的計算機系統資源開銷相對要少很多。同時,控制點個數越多,就越能夠逼近真實的曲面,所以選擇好的演算法和適當的控制點個數相當重要。opengl實現曲面的方法和曲線類似,它使用二維的glmap2和gleva...
OpenGL系統設計 OpenGL擴充套件
和微軟的direct3d directgraphics相比較,opengl的乙個最大的優點是其擴充套件機制。對於顯示卡硬體的新功能,除非微軟發布了directx的新版本,否則,程式設計師是無法使用的。但opengl就不同了,opengl給硬體廠商和程式設計師提供了擴充套件機制,讓硬體廠商增加基於顯示...
OpenGL系統設計 4 三維建模(2)
我們再來利用三角形 四邊形 多邊形製作乙個簡單的小屋,看起來更加逼真一些。小屋由5個四邊形和兩個五邊形組成。牆面的顏色我們可以在畫筆中找到後,得到其rgb值後再使用glcolor3ub來設定。void drawhouse 圖4 2複雜三維模型 上面在繪製立方體時要乙個面乙個面地繪製,顯得很麻煩。實際...