用OpenGL畫線

. 兩點之間的連線稱之爲線段,在屏幕上顯示線段放在如今已經不是稀奇的事情,大多數高級圖形API均可以輕鬆實現,我嘗試用OpenGL畫線,在這裏記錄一下收穫.c++

. OpenGL這個級別的圖形API,一般會提供一些繪製基本圖形的接口,這些基本圖形稱之爲圖元,而OpenGL提供了點,線段,三角形三種圖元繪製接口,說出來你可能不信,OpenGL就只能繪製這三種圖形,本篇博文的主題是畫線,OpenGL能直接繪製的圖元之一.編程


用OpenGL繪製線段圖元

給出兩點的座標,調用API便可直接畫出線段.設計

//  僞代碼
glVertex(x0, y0);           //  點A
glVertex(x1, y1);           //  點B
glDrawPrimitive(GL_LINES);  //  繪製線段圖元

若是執行正確,你能夠看到一條線段.3d

opengl_線段

OpenGL同時還提供調整線段寬度和顏色的接口.code

//  僞代碼
glLineWidth(width)          //  寬度
glLineColor(r, g, b, a)     //  顏色
glVertex(x0, y0);           //  點A
glVertex(x1, y1);           //  點B
glDrawPrimitive(GL_LINES);  //  繪製線段圖元

opengl_線段粗

若是這篇博文有讀者,若是剛好你就是這篇博文的讀者,看到這裏,你大概已經被OpenGL的威力震懾住了,冷靜一下,接着往下看.blog

不少時候,咱們想要繪製連續的線段,OpenGL能夠輕鬆搞定這個問題,你只須要重複上述代碼就能夠了.接口

//  僞代碼
glLineWidth(width)          //  寬度
glLineColor(r, g, b, a)     //  顏色
glVertex(x0, y0);           //  第一條線段點A
glVertex(x1, y1);           //  第一條線段點B
glVertex(x2, y2);           //  第二條線段點A
glVertex(x3, y3);           //  第二條線段點B
glDrawPrimitive(GL_LINES);  //  繪製線段圖元

opengl_線段2

只須要短短几行代碼,就能夠畫出兩條線段,在驚歎之餘,你可能沒有發現,在兩條線段交接處,很明顯缺掉了一塊,這是由於繪製的線段寬度是3像素,而OpenGL繪製的線段是直角,實際上上圖是兩個首尾相連的長方形,經過下面的圖能清晰的看出問題所在.it

opengl_線段22

很容易想象,線越寬,線段交接處的缺口越大,大多數人都接受不了這種缺陷,同時大多數人都認爲它不是個問題,若是這篇博文有觀衆,且剛好就是你,你確定有同感,但事實上,你猜的沒錯,由於OpenGL在繪製線段圖元的設計上就沒考慮過這個問題,因此按上述思路去畫線,這個問題無解,無解的問題就不是問題,因此這的確不是個問題.class


用三角形圖元來繪製線段

. 不少新人常常會被線段圖元迷惑,誤覺得OpenGL畫線就的用它,實際上OpenGL對線段圖元提供的接口很是有限,即使如此,它仍是有能發揮特長的使用場景,但本文所描述的場景它並不適合.im

. 要解決"缺口"的問題,得換一種思路,先生成線段的網格,再填充網格,這樣靈活度就高多了.

線段_網格

線段_網格_填充

從上圖能夠看出,線段的交接處看起來沒有那麼突兀了.

此外,由於線段是用網格填充的,因此咱們能夠爲所欲爲的修改網格,以及經過可編程管線調整它.


基於上述內容畫的一些線段

閃電

閃電線段

閃電

閃電

曲線

曲線_網格

曲線

曲線

相關文章
相關標籤/搜索