opengl這個庫好,比起之前用過的opencv,cuda等開放庫,opengl才幾兆,不用安裝,而且相對於vtk來說,opengl封裝好的函式較為底層,靈活度較高,也可以更好地體現自己編寫的演算法的好壞。
opengl寫程式先要opengl的標頭檔案,lib,.dll相關配置可以在網上找到,這裡不再累述。
對乙個像我一樣的初學者來書目前認為的opengl畫圖主要有三步:
(1)先要產生乙個畫圖的視窗,以及對視窗的相關配置;
(2)要在視窗中產生一張畫布(對於2d的圖畫來說),並對畫布進行一定的配置,如背景,畫布的大小,觀察的角度等;
(3)要編寫畫筆移動的軌跡,這是畫出來畫好壞的關鍵,這裡數學好重要
先上一段程式來對照程式進行分析:
#include
#include
#include
#include
#include
#include
using
namespace
std;
void myinit(void)
void drawdinosaur(void)
glend();
}glflush();
instream.close();
}void main()
先是對顯示視窗的設定
glutinitdisplaymode(glut_single | glut_rgb);
glutinitwindowsize(640, 480);
glutinitwindowposition(100, 150);
glutcreatewindow("opengl");
glutdisplayfunc(drawdinosaur);
glutinitdisplaymode()建立視窗
其中有多種方式可以選擇:
值對應巨集定義
意義glut_rgb
0x0000
指定 rgb 顏色模式的視窗
glut_rgba
0x0000
指定 rgba 顏色模式的視窗
glut_index
0x0001
指定顏色索引模式的視窗
glut_single
0x0000
指定單快取視窗
glut_double
0x0002
指定雙快取視窗
glut_accum
0x0004
視窗使用累加快取
glut_alpha
0x0008
視窗的顏色分量包含 alpha 值
glut_depth
0x0010
視窗使用深度快取
glut_stencil
0x0020
視窗使用模板快取
glut_multisample
0x0080
指定支援多樣本功能的視窗
glut_stereo
0x0100
指定立體視窗
glut_luminance
0x0200
視窗使用亮度顏色模型
其中幾種快取方式介紹一下:
單緩衝,實際上就是將所有的繪圖指令在視窗上執行,就是直接在視窗上繪圖,這樣的繪圖效率是比較慢的,如果使用單緩衝,而電腦比較慢,你回到螢幕的閃爍。
雙緩衝,實際上的繪圖指令是在乙個緩衝區完成,這裡的繪圖非常的快,在繪圖指令完成之後,再通過交換指令把完成的圖形立即顯示在螢幕上,這就避免了出現繪圖的不完整,同時效率很高。
顏色快取(color buffer)
包含每個象素的顏色資訊。顏色資訊可以是顏色索引值(在顏色索引方式下),也可以是顏色的紅、綠、藍3個分量(在rgba方式下),還可以存放表示物體透明程度的alpha值。
深度快取(depth buffer)
包含每個象素的深度值。深度值與z座標有關,描述物體上某點距離觀察點的遠近,也可以稱它為z快取(z buffer) 。
模板快取(stencil buffer)
包含物體的模板值。模板值具有遮蔽作用,用於控制繪製的區域,使螢幕上某些區域可畫,某些區域不可畫。
累積快取(accumulation buffer)
包含顏色資訊。其可以合成一系列的繪製結果,實現某些特殊效果。
來自設下幾個為設定視窗大小,名字,位置
glutdisplayfunc(drawdinosaur);為執行畫圖函式
接著對畫布進行初始化:
void myinit(void)
glclearcolor(r,g,b,a):設定顏色快取的清除值,其中rbg為設定擦除後rgb的顏色,a為透明度;
glcolor3f(0,0,0):設定畫筆的顏色;
glpointsize()為設定柵格化點的大小;
glmatrixmode()為選擇什麼矩陣為操作矩陣(這有點像cad)
可選的值:
gl_modelview,對模型視景矩陣堆疊應用隨後的矩陣操作.
gl_projection,對投影矩陣應用隨後的矩陣操作.
gl_texture,對紋理矩陣堆疊應用隨後的矩陣操作.
glloadidentity();重置當前指定的矩陣為單位矩陣.
gluortho2d();將畫布投影到視窗
為畫恐龍的函式
void drawdinosaur(void)
glend();
}glflush();
instream.close();
}
主要功能為讀取dino.dat檔案中點的數目,座標資訊,畫在畫布上;
instream >>為讀取檔案中座標
其中部分點集為:
21
2932 435
10 439
4 438
2 433
4 428
6 425
10 420
15 416
21 413
30 408
42 406
47 403
56 398
63 391
71 383
79 369
84 356
87 337
89 316
88 302
86 294
83 278
79 256
78 235
79 220
85 204
94 190
98 183
98 182
9116 189
可以看到這只恐龍由21個點集,第乙個點集為29個點,剩下為座標
畫點的方式為先讀取點集的個數
glbegin(gl_********_strip);開始畫點
for (int i = 0; i < numlines; i++)
為根據x,y描點
glend();為乙個點集畫完,
下乙個迴圈重複這一操作,
glflush();為展示畫的影象
最後的結果為:
人在為了保護最重要的人的時候,會變得非常堅強。-白
不該下雪的季節卻下雪了,白是你在哭泣嗎?如果可以的話,真的很想和你去同乙個地方。-桃地再不斬
OPENGL學習筆記(一)畫乙隻dinosaur
opengl這個庫好,比起之前用過的opencv,cuda等開放庫,opengl才幾兆,不用安裝,而且相對於vtk來說,opengl封裝好的函式較為底層,靈活度較高,也可以更好地體現自己編寫的演算法的好壞。opengl寫程式先要opengl的標頭檔案,lib,dll相關配置可以在網上找到,這裡不再累...
LaTeX學習筆記 一 畫重點
如果你對word的排版效果不滿意?投稿期刊要求用latex排版?讓我們通過乙個例子來瞧瞧latex的強大吧!pprimef p t 1f t d t sum f p int f t mathrm pi t pprime f p t 1 f t d t 如下 sum f p int f t mathr...
OpenGL學習筆記 2 畫乙個正方形
void baseinit glfwmakecontextcurrent glwindow if gladloadglloader gladloadproc glfwgetprocaddress 畫乙個普通的正方形 void normalsquare 索引 unsigned int indices ...