OPENGL學習筆記(一)畫乙隻dinosaur

2021-09-23 17:51:55 字數 3857 閱讀 2964

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 ...