學習筆記 OpenGL01

2021-06-04 13:51:06 字數 4538 閱讀 4268

首先,需要包含標頭檔案#include ,這是glut的標頭檔案。 本來opengl程式一般還要包含和,但glut的標頭檔案中已經自動將這兩個檔案包含了,不必再次包含。

以glut開頭的函式都是glut工具包所提供的函式,下面對用到的幾個函式進行介紹:

1、glutinit,對glut進行初始化,這個函式必須在其它的glut使用之前呼叫一次。其格式比較死板,一般照抄這句glutinit(&argc, argv)就可以了。

2、glutinitdisplaymode,設定顯示方式,其中glut_rgb表示使用rgb顏色,與之對應的還有glut_index(表示使用索引顏色)。glut_single表示使用單緩衝,與之對應的還有glut_double(使用雙緩衝)。

3、glutinitwindowposition,這個簡單,設定視窗在螢幕中的位置。

4、glutinitwindowsize,這個也簡單,設定視窗的大小。

5、glutcreatewindow,根據前面設定的資訊建立視窗。引數將被作為視窗的標題。注意:視窗被建立後,並不立即顯示到螢幕上。需要呼叫glutmainloop才能看到視窗。

6、glutdisplayfunc,設定乙個函式,當需要進行畫圖時,這個函式就會被呼叫。(這個說法不夠準確,但準確的說法可能初學者不太好理解,暫時這樣說吧)。

7、glutmainloop,進行乙個訊息迴圈。(這個可能初學者也不太明白,現在只需要知道這個函式可以顯示視窗,並且等待視窗關閉後才會返回,這就足夠了。)

種以gl開頭的函式都是opengl的標準函式,下面對用到的函式進行介紹。

1、glclear,清除。gl_color_buffer_bit表示清除顏色,glclear函式還可以清除其它的東西,但這裡不作介紹。

2、glrectf,畫乙個矩形。四個引數分別表示了位於對角線上的兩個點的橫、縱座標。

3、glflush,保證前面的opengl命令立即執行(而不是讓它們在緩衝區中等待)。其作用跟fflush(stdout)類似。

點:opengl中的點將被畫成單個的畫素

直線:opengl的「直線」概念與數學上的「線段」接近,它可以由兩個端點來確定。

多邊形:乙個多邊形必須是乙個「凸多邊形」(其定義為:多邊形內任意兩點所確定的線段都在多邊形內,由此也可以推導出,凸多邊形不能是空心的),通常用三角形

通過點、直線和多邊形,就可以組合成各種幾何圖形

opengl提供了一系列函式。它們都以glvertex開頭,後面跟乙個數字和1~2個字母。例如:

glvertex2d  glvertex2f  glvertex3f  glvertex3fv 等等。

數字表示引數的個數,2表示有兩個引數,3表示三個,4表示四個。

字母表示引數的型別,s表示16位整數(opengl中將這個型別定義為glshort), i表示32位整數(opengl中將這個型別定義為glint和glsizei), f表示32位浮點數(opengl中將這個型別定義為glfloat和glclampf), d表示64位浮點數(opengl中將這個型別定義為gldouble和glclampd)。 v表示傳遞的幾個引數將使用指標的方式

opengl要求:指定頂點的命令必須包含在glbegin函式之後,glend函式之前(否則指定的頂點將被忽略)。並由glbegin來指明如何使用這些點。 例如:

glbegin(gl_points);

glvertex2f(0.0f, 0.0f);

glvertex2f(0.5f, 0.0f);

glend();

則這兩個點將分別被畫出來。如果將gl_points替換成gl_lines,則兩個點將被認為是直線的兩個端點,opengl將會畫出一條直線。 還可以指定更多的頂點,然後畫出更複雜的圖形。

gl_points和gl_lines,還有gl_line_strip,gl_line_loop,gl_********s,gl_********_strip,gl_********_fan等,每種方式的大致效果見下圖:

(見圖1)

點大小:預設值為1.0f,函式原型為void glpointsize(glfloat size);

例子:void mydisplay(void)

glclear(gl_color_buffer_bit);

glpointsize(5.0f);

glbegin(gl_points);

glend();

glflush();

函式原型void gllinewidth(glfloat width);

其用法跟glpointsize類似。

首先,使用glenable(gl_line_stipple);來啟動虛線模式(使用gldisable(gl_line_stipple)可以關閉之)。 然後,使用gllinestipple來設定虛線的樣式。 void gllinestipple(glint factor, glushort pattern); pattern是由1和0組成的長度為16的序列,從最低位開始看,如果為1,則直線上接下來應該畫的factor個點將被畫為實的;如果為0,則直線上接下來應該畫的factor個點將被畫為虛的。

雖然我們目前還沒有真正的使用三維座標來畫圖,但是建立一些三維的概念還是必要的。 從三維的角度來看,乙個多邊形具有兩個面。每乙個面都可以設定不同的繪製方式:填充、只繪製邊緣輪廓線、只繪製頂點,其中「填充」是預設的方式。可以為兩個面分別設定不同的方式。

glpolygonmode(gl_front, gl_fill); // 設定正面為填充方式 glpolygonmode(gl_back, gl_line); // 設定反面為邊緣繪製方式 glpolygonmode(gl_front_and_back, gl_point); // 設定兩面均為頂點繪製方式

一般約定為「頂點以逆時針順序出現在螢幕上的面」為「正面」,另乙個麵即成為「反面」。生活中常見的物體表面,通常都可以用這樣的「正面」和「反面」,「合理的」被表現出來。但也有一些表面比較特殊。例如「麥比烏斯帶」,可以全部使用「正面」或全部使用「背面」來表示。 可以通過glfrontface函式來交換「正面」和「反面」的概念。

glfrontface(gl_ccw); // 設定ccw方向為「正面」,ccw即counterclockwise,逆時針 glfrontface(gl_cw); // 設定cw方向為「正面」,cw即clockwise,順時針

*有例程opengl4

在三維空間中,乙個多邊形雖然有兩個面,但我們無法看見背面的那些多邊形,而一些多邊形雖然是正面的,但被其他多邊形所遮擋。如果將無法看見的多邊形和可見的多邊形同等對待,無疑會降低我們處理圖形的效率。在這種時候,可以將不必要的面剔除。 首先,使用glenable(gl_cull_face);來啟動剔除功能(使用gldisable(gl_cull_face)可以關閉之) 然後,使用glcullface來進行剔除。 glcullface的引數可以是gl_front,gl_back或者gl_front_and_back,分別表示剔除正面、剔除反面、剔除正反兩面的多邊形。 注意:剔除功能只影響多邊形,而對點和直線無影響。例如,使用glcullface(gl_front_and_back)後,所有的多邊形都將被剔除,所以看見的就只有點和直線。

直線可以被畫成虛線,而多邊形則可以進行鏤空。 首先,使用glenable(gl_polygon_stipple);來啟動鏤空模式(使用gldisable(gl_polygon_stipple)可以關閉之)。 然後,使用glpolygonstipple來設定鏤空的樣式。 void glpolygonstipple(const glubyte *mask); 其中的引數mask指向乙個長度為128位元組的空間,它表示了乙個32*32的矩形應該如何鏤空。其中:第乙個位元組表示了最左下方的從左到右(也可以是從右到左,這個可以修改)8個畫素是否鏤空(1表示不鏤空,顯示該畫素;0表示鏤空,顯示其後面的顏色),最後乙個位元組表示了最右上方的8個畫素是否鏤空。

首先,用windows自帶的畫筆程式新建一副,取名為mask.bmp,注意儲存時,應該選擇「單色位圖」。在「圖象」->「屬性」對話方塊中,設定的高度和寬度均為32。用放大鏡觀察,並編輯之。黑色對應二進位制零(鏤空),白色對應二進位制一(不鏤空),編輯完畢後儲存。 然後,就可以使用以下**來獲得這個mask陣列了。

static glubyte mask[128];

file *fp; fp = fopen("mask.bmp", "rb");

if( !fp ) exit(0);

// 移動檔案指標到這個位置,使得再讀sizeof(mask)個位元組就會遇到檔案結束

// 注意-(int)sizeof(mask)雖然不是什麼好的寫法,但這裡它確實是正確有效的

// 如果直接寫-sizeof(mask)的話,因為sizeof取得的是乙個無符號數,取負號會有問題 if( fseek(fp, -(int)sizeof(mask), seek_end) ) exit(0);

// 讀取sizeof(mask)個位元組到mask

if( !fread(mask, sizeof(mask), 1, fp) )

exit(0);

fclose(fp);

編輯乙個作為mask,並用上述方法取得mask陣列,執行後觀察效果。 說明:繪製虛線時可以設定factor因子,但多邊形的鏤空無法設定factor因子。請用滑鼠改變視窗的大小,觀察鏤空效果的變化情況。

*有例程opengl5

OpenGL學習01 OpenGL學習環境搭建

平台 windows 7 開發環境 visual studio 2012 工具軟體 glutdlls37beta.zip 將glutdlls37beta.zip解壓後得到glut.h glut.lib glut32.lib glut.dll glut32.dll,其中glut.h為標頭檔案放到c p...

OpenGL學習筆記

我是一名ios開發者,opengl是乙個比較重要的技術。所以就此開啟我的菜鳥之路。opengl open graphics library 是乙個跨程式設計語 言 跨平台的程式設計圖形程式接 它將計算機的資源抽象稱為乙個個opengl的物件,對這些資源的操作抽象為乙個的opengl指令.direct...

OpenGL學習筆記

數學基礎 叉積mv矩陣 文章內容主要來自 計算機圖形學程式設計 使用opengl和c 光柵化過程確定了用以顯示3個頂點所確定的三角形的所有畫素需要繪製的位置 光柵化過程開始時先對三角形的每對頂點進行插值 如果光柵化過程到此為止,那麼呈現出的影象將會是線框模型 使用 glpolygonmode gl ...