第七課 光照和鍵盤

2021-08-30 23:33:20 字數 1986 閱讀 8968

這一課我會教您如何使用三種不同的紋理濾波方式。教您如何使用鍵盤來移動場景中的物件,還會教您在opengl場景中應用簡單的光照。這一課包含了很多內容,如果您對前面的課程有疑問的話,先回頭複習一下。進入後面的**之前,很好的理解基礎知識十分重要。

我們要在第一課的**上進行改動就可以了。

我們將要增加乙個loadgltextures()函式來處理有關紋理操作的。我們將增加一些變數,稍後我們對這些變數進行解釋。

nehewidget類

(由nehewidget.h 展開。)

protected:

void loadgltextures();

在這個函式中我們會載入指定的並生成相應當紋理。

protected:

bool fullscreen;

glfloat xrot, yrot, zrot;

glfloat zoom;

glfloat xspeed, yspeed;

gluint texture[3];

gluint filter;

bool light;

};上面就是新增的三個變數xrot、yrot、zrot來處理立方體在三個方向上的旋轉。zoom是場景深入螢幕的距離。xspeed和yspeed是立方體在x軸和y軸上旋轉的速度。texture[3]用來儲存三個紋理。filter表明的是使用哪個紋理。light是說明現在是否使用光源。

(由nehewidget.cpp 展開。)

glfloat lightambient[4] = ;

glfloat lightdiffuse[4] = ;

glfloat lightposition[4] = ;

這裡定義了三個陣列,它們描述的是和光源有關的資訊。

我們將使用兩種不同的光。第一種稱為環境光。環境光來自於四面八方。所有場景中的物件都處於環境光的照射中。第二種型別的光源叫做漫射光。漫射光由特定的光源產生,並在您的場景中的物件表面上產生反射。處於漫射光直接照射下的任何物件表面都變得很亮,而幾乎未被照射到的區域就顯得要暗一些。這樣在我們所建立的木板箱的稜邊上就會產生的很不錯的陰影效果。

建立光源的過程和顏色的建立完全一致。前三個引數分別是rgb三色分量,最後乙個是alpha通道引數。

因此,第一行有關lightambient的**使我們得到的是半亮(0.5)的白色環境光。如果沒有環境光,未被漫射光照到的地方會變得十分黑暗。

第二行有關lightdiffuse的**使我們生成最亮的漫射光。所有的引數值都取成最大值1.0。它將照在我們木板箱的前面,看起來挺好。

第三行有關lightposition的**使我們儲存光源的位置。前三個引數和gltranslate中的一樣。依次分別是xyz軸上的位移。由於我們想要光線直接照射在木箱的正面,所以xy軸上的位移都是0.0。第三個值是z軸上的位移。為了保證光線總在木箱的前面,所以我們將光源的位置朝著觀察者(就是您哪。)挪出螢幕。我們通常將螢幕也就是顯示器的螢幕玻璃所處的位置稱作z軸的0.0點。所以z軸上的位移最後定為2.0。假如您能夠看見光源的話,它就浮在您顯示器的前方。當然,如果木箱不在顯示器的螢幕玻璃後面的話,您也無法看見箱子。最後乙個引數取為1.0。這將告訴opengl這裡指定的座標就是光源的位置,以後的教程中我會多加解釋。

nehewidget::nehewidget( qwidget* parent, bool fs )

: qglwidget( parent )

{xrot = yrot = zrot = 0.0;

zoom = -5.0;

xspeed = yspeed = 0.0;

filter = 0;

light = false;

fullscreen = fs;

setgeometry( 0, 0, 640, 480 );

setwindowtitle(tr( "nehe's texture, lighting & keyboard tutorial") );

if ( fullscreen )

showfullscreen();

starttimer(5);

NeHe OpenGL第七課 光照和鍵盤

nehe opengl第七課 光照和鍵盤 光照和鍵盤控制 在這一課裡,我們將新增光照和鍵盤控制,它讓程式看起來更美觀。這一課我會教您如何使用三種不同的紋理濾波方式。教您如何使用鍵盤來移動場景中的物件,還會教您在opengl場景中應用簡單的光照。這一課包含了很多內容,如果您對前面的課程有疑問的話,先回...

C語言第七課

主要內容 結構體 很重要,掌握 一 結構體的宣告 結構體是一種比較靈活的資料型別,與oc要學的類很相似 結構體是一種自己定義的資料型別示例 struct 結構體名 student 定義乙個學生型別 由結構體型別修飾的變數,叫結構體變數 定義 struct 結構體名 變數名 示例 struct stu...

第七課 C變數

第七課c變數 7.1 c 變數介紹 變數是程式可操作的儲存區的名稱。c 中每個變數都有特定的型別,型別決定了變數儲存的大小和布局,該範圍內的值都可以儲存在記憶體中,運算子可應用於變數上。變數的名稱可以由字母 數字和下劃線字元組成。它必須以字母或下劃線開頭。大寫字母和小寫字母是不同的,因為c 是大小寫...