亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

NeHe的opengl教程delphi版(7)----濾波

2019-11-18 18:32:55
字體:
供稿:網(wǎng)友
 

{
這一課我會(huì)教您如何使用三種不同的紋理濾波方式。
教您如何使用鍵盤來移動(dòng)場景中的對(duì)象,還會(huì)教您在OpenGL場景中應(yīng)用簡單的光照。
這一課包含了很多內(nèi)容,如果您對(duì)前面的課程有疑問的話,先回頭復(fù)習(xí)一下。
進(jìn)入后面的代碼之前,很好的理解基礎(chǔ)知識(shí)十分重要。
我們還是在第一課的代碼上加以修改。
跟以前不一樣的是,只要有任何大的改動(dòng),我都會(huì)寫出整段代碼。

首先我們還要加進(jìn)SysUtils單元和Glaux單元。
}

Uses
   SysUtils,
   opengl,
   windows,
   Messages,
   Glaux In '../../GLAUX/Glaux.pas';

   //下面幾行是增加新的變量。

   //我們?cè)黾尤齻€(gè)布爾變量。
   // light 變量跟蹤光照是否打開。
   //變量lp和fp用來存儲(chǔ)'L' 和'F'鍵是否按下的狀態(tài)。
   //后面我會(huì)解釋這些變量的重要性?,F(xiàn)在,先放在一邊吧。
   light            : Boolean;          // 光源的開/關(guān)
   lp               : Boolean;          // L鍵按下了么?
   fp               : Boolean;          // F鍵按下了么?

   //現(xiàn)在設(shè)置5個(gè)變量來控制繞x軸和y軸旋轉(zhuǎn)角度的步長,
   //以及繞x軸和y軸的旋轉(zhuǎn)速度。
   //另外還創(chuàng)建了一個(gè)z變量來控制進(jìn)入屏幕深處的距離。
   xrot             : GLfloat;          // X 旋轉(zhuǎn)
   yrot             : GLfloat;          // Y 旋轉(zhuǎn)
   xspeed           : GLfloat;          // X 旋轉(zhuǎn)速度
   yspeed           : GLfloat;          // Y 旋轉(zhuǎn)速度

   z                : GLfloat = -5.0 f; // 深入屏幕的距離

   //接著設(shè)置用來創(chuàng)建光源的數(shù)組。
   //我們將使用兩種不同的光。
   //第一種稱為環(huán)境光。環(huán)境光來自于四面八方。
   //所有場景中的對(duì)象都處于環(huán)境光的照射中。
   //第二種類型的光源叫做漫射光。
   //漫射光由特定的光源產(chǎn)生,并在您的場景中的對(duì)象表面上產(chǎn)生反射。
   //處于漫射光直接照射下的任何對(duì)象表面都變得很亮,
   //而幾乎未被照射到的區(qū)域就顯得要暗一些。
   //這樣在我們所創(chuàng)建的木板箱的棱邊上就會(huì)產(chǎn)生的很不錯(cuò)的陰影效果。
   //創(chuàng)建光源的過程和顏色的創(chuàng)建完全一致。
   //前三個(gè)參數(shù)分別是RGB三色分量,最后一個(gè)是alpha通道參數(shù)。

   //因此,下面的代碼我們得到的是半亮(0.5f)的白色環(huán)境光。
   //如果沒有環(huán)境光,未被漫射光照到的地方會(huì)變得十分黑暗。
   LightAmbient     : Array[0..3] Of GLfloat = (0.5, 0.5, 0.5, 1.0);  //環(huán)境光參數(shù) ( 新增 )
   //下一行代碼我們生成最亮的漫射光。
   //所有的參數(shù)值都取成最大值1.0f。
   //它將照在我們木板箱的前面,看起來挺好。
   LightDiffuse     : Array[0..3] Of GLfloat = (1.0, 1.0, 1.0, 1.0);  // 漫射光參數(shù) ( 新增 )
   //最后我們保存光源的位置。
   //前三個(gè)參數(shù)和glTranslate中的一樣。
   //依次分別是XYZ軸上的位移。
   //由于我們想要光線直接照射在木箱的正面,所以XY軸上的位移都是0.0。
   //第三個(gè)值是Z軸上的位移。
   //為了保證光線總在木箱的前面,
   //所以我們將光源的位置朝著觀察者(就是您哪。)挪出屏幕。
   //我們通常將屏幕也就是顯示器的屏幕玻璃所處的位置稱作Z軸的0.0點(diǎn)。
   //所以Z軸上的位移最后定為2.0。
   //假如您能夠看見光源的話,它就浮在您顯示器的前方。
   //當(dāng)然,如果木箱不在顯示器的屏幕玻璃后面的話,您也無法看見箱子。
   //『譯者注:我很欣賞NeHe的耐心。
   //說真的有時(shí)我都打煩了,這么簡單的事他這么廢話干嘛?
   //但如果什么都清楚,您還會(huì)翻著這樣的頁面看個(gè)沒完么?』
   //最后一個(gè)參數(shù)取為1.0f。
   //這將告訴OpenGL這里指定的坐標(biāo)就是光源的位置,以后的教程中我會(huì)多加解釋。
   LightPosition    : Array[0..3] Of GLfloat = (0.0, 0.0, 2.0, 1.0);  // 光源位置 ( 新增 )

   //filter 變量跟蹤顯示時(shí)所采用的紋理類型。
   //第一種紋理(texture 0) 使用gl_nearest(不光滑)濾波方式構(gòu)建。
   //第二種紋理 (texture 1) 使用gl_linear(線性濾波) 方式,
   //離屏幕越近的圖像看起來就越光滑。
   //第三種紋理 (texture 2) 使用 mipmapped濾波方式,
   //這將創(chuàng)建一個(gè)外觀十分優(yōu)秀的紋理。
   //根據(jù)我們的使用類型,filter 變量的值分別等于 0, 1 或 2 。
   //下面我們從第一種紋理開始。
   //texture為三種不同紋理分配儲(chǔ)存空間。
   //它們分別位于在 texture[0], texture[1] 和 texture[2]中。

   filter           : GLuint;           // 濾波類型
   texture          : Array[0..2] Of GLuint; // 3種紋理的儲(chǔ)存空間

PRocedure glGenTextures(n: GLsizei; Var textures: GLuint); stdcall; external
   opengl32;

Procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external
   opengl32;

Function gluBuild2DMipmaps(target: GLenum; components, width, height: GLint;
   format, atype: GLenum; data: Pointer): Integer; stdcall; external glu32 name
   'gluBuild2DMipmaps';

{
現(xiàn)在載入一個(gè)位圖,并用它創(chuàng)建三種不同的紋理。
這一課使用glaux輔助庫來載入位圖,
因此在編譯時(shí)您應(yīng)該確認(rèn)是否包含了glaux庫。
我知道Delphi和VC++都包含了glaux庫,但別的語言不能保證都有。
『譯者注:glaux是OpenGL輔助庫,根據(jù)OpenGL的跨平臺(tái)特性,
所有平臺(tái)上的代碼都應(yīng)通用。但輔助庫不是正式的OpenGL標(biāo)準(zhǔn)庫,
沒有出現(xiàn)在所有的平臺(tái)上。但正好在Win32平臺(tái)上可用。
呵呵,BCB當(dāng)然也沒問題了?!贿@里我只對(duì)新增的代碼做注解。
如果您對(duì)某行代碼有疑問的話,請(qǐng)查看教程六。
那一課很詳細(xì)的解釋了載入、創(chuàng)建紋理的內(nèi)容。
在上一段代碼后面及 glResizeWnd ()之前的位置,
我們?cè)黾恿讼旅娴拇a。這和第六課中載入位圖的代碼幾乎相同。
}

Function LoadBmp(filename: pchar): PTAUX_RGBImageRec;
Var
   BitmapFile       : Thandle;          // 文件句柄
Begin
   If Filename = '' Then                // 確保文件名已提供。
      result := Nil;                    // 如果沒提供,返回 NULL
   BitmapFile := FileOpen(Filename, fmOpenWrite); //嘗試打開文件
   If BitmapFile > 0 Then               // 文件存在么?
      Begin
         FileClose(BitmapFile);         // 關(guān)閉句柄
         result := auxDIBImageLoadA(filename); //載入位圖并返回指針
      End
   Else
      result := Nil;                    // 如果載入失敗,返回NiL。
End;

Function LoadTexture: boolean;          // 載入位圖并轉(zhuǎn)換成紋理
Var
   Status           : boolean;          // Status 指示器
   TextureImage     : Array[0..1] Of PTAUX_RGBImageRec; // 創(chuàng)建紋理的存儲(chǔ)空間
Begin
   Status := false;
   ZeroMemory(@TextureImage, sizeof(TextureImage)); // 將指針設(shè)為 NULL
   TextureImage[0] := LoadBMP('Walls.bmp');
   If TextureImage[0] <> Nil Then
      Begin
         Status := TRUE;                // 將 Status 設(shè)為 TRUE
         glGenTextures(1, texture[0]);  // 創(chuàng)建紋理
         //第六課中我們使用了線性濾波的紋理貼圖。
         //這需要機(jī)器有相當(dāng)高的處理能力,但它們看起來很不錯(cuò)。
         //這一課中,我們接著要?jiǎng)?chuàng)建的第一種紋理使用 GL_NEAREST方式。
         //從原理上講,這種方式?jīng)]有真正進(jìn)行濾波。
         //它只占用很小的處理能力,看起來也很差。
         //唯一的好處是這樣我們的工程在很快和很慢的機(jī)器上都可以正常運(yùn)行。
         //您會(huì)注意到我們?cè)?MIN 和 MAG 時(shí)都采用了GL_NEAREST,
         //你可以混合使用 GL_NEAREST 和 GL_LINEAR。
         //紋理看起來效果會(huì)好些,但我們更關(guān)心速度,所以全采用低質(zhì)量貼圖。
         //MIN_FILTER在圖像繪制時(shí)小于貼圖的原始尺寸時(shí)采用。
         //MAG_FILTER在圖像繪制時(shí)大于貼圖的原始尺寸時(shí)采用。

         // 創(chuàng)建 Nearest 濾波貼圖
         glBindTexture(GL_TEXTURE_2D, texture[0]);
         // 生成紋理
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);  // ( 新增 )
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);  // ( 新增 )

         glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0].sizeX,
            TextureImage[0].sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE,
            TextureImage[0].data);

         //下個(gè)紋理與第六課的相同,線性濾波。唯一的不同是這次放在了
         //texture[1]中。因?yàn)檫@是第二個(gè)紋理。如果放在
         //texture[0]中的話,他將覆蓋前面創(chuàng)建的 GL_NEAREST紋理。
         glBindTexture(GL_TEXTURE_2D, texture[1]);  // 使用來自位圖數(shù)據(jù)生成 的典型紋理
         // 生成紋理
         glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0].sizeX,
            TextureImage[0].sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE,
            TextureImage[0].data);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);  // 線形濾波
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);  // 線形濾波

         //下面是創(chuàng)建紋理的新方法。 Mipmapping!
         //『譯者注:這個(gè)詞的中文我翻不出來,不過沒關(guān)系??赐赀@一段,您就知道意思最重要?!?BR>         //您可能會(huì)注意到當(dāng)圖像在屏幕上變得很小的時(shí)候,很多細(xì)節(jié)將會(huì)丟失。
         //剛才還很不錯(cuò)的圖案變得很難看。當(dāng)您告訴OpenGL創(chuàng)建一個(gè) mipmapped的紋理后,
         //OpenGL將嘗試創(chuàng)建不同尺寸的高質(zhì)量紋理。當(dāng)您向屏幕繪制一個(gè)mipmapped紋理的時(shí)候,
         //OpenGL將選擇它已經(jīng)創(chuàng)建的外觀最佳的紋理(帶有更多細(xì)節(jié))來繪制,
         //而不僅僅是縮放原先的圖像(這將導(dǎo)致細(xì)節(jié)丟失)。
         //我曾經(jīng)說過有辦法可以繞過OpenGL對(duì)紋理寬度和高度所加的限制——64、128、256,等等。
         //辦法就是 gluBuild2DMipmaps。據(jù)我的發(fā)現(xiàn),您可以使用任意的位圖來創(chuàng)建紋理。
         //OpenGL將自動(dòng)將它縮放到正常的大小。
         //因?yàn)槭堑谌齻€(gè)紋理,我們將它存到texture[2]。這樣本課中的三個(gè)紋理全都創(chuàng)建好了。
         // 創(chuàng)建 MipMapped 紋理
         glBindTexture(GL_TEXTURE_2D, texture[2]);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
            GL_LINEAR_MIPMAP_NEAREST);  // ( 新增 )
         //下面一行生成 mipmapped 紋理。
         //我們使用三種顏色(紅,綠,藍(lán))來生成一個(gè)2D紋理。
         //TextureImage[0].sizeX 是位圖寬度,
         //TextureImage[0].sizeY 是位圖高度,
         //(====不知為什么,delphi下這個(gè)函數(shù)沒有height這個(gè)參數(shù),
         //但是幫助中卻有,不知delphi再搞什么,郁悶ing......
         //最后我在前面自己寫了一個(gè)gluBuild2DMipmaps,
         //來載入glu32.dll中的gluBuild2DMipmaps函數(shù)=====)
         //GL_RGB意味著我們依次使用RGB色彩。
         //GL_UNSIGNED_BYTE 意味著紋理數(shù)據(jù)的單位是字節(jié)。
         //TextureImage[0].data指向我們創(chuàng)建紋理所用的位圖。
         gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0].sizeX,
            TextureImage[0].sizey, GL_RGB, GL_UNSIGNED_BYTE,
            TextureImage[0].data);      //(新增)  }
      End;
   If assigned(TextureImage[0]) Then    // 紋理是否存在
      If assigned(TextureImage[0].data) Then // 紋理圖像是否存在
         TextureImage[0].data := Nil;   // 釋放紋理圖像占用的內(nèi)存
   TextureImage[0] := Nil;              // 釋放圖像結(jié)構(gòu)
   result := Status;                    // 返回 Status
End;

//接著應(yīng)該載入紋理并初始化OpenGL設(shè)置了。
//GLInit函數(shù)的第一行使用上面的代碼載入紋理。
//創(chuàng)建紋理之后,我們調(diào)用glEnable(GL_TEXTURE_2D)啟用2D紋理映射。
//陰影模式設(shè)為平滑陰影( smooth shading )。
//背景色設(shè)為黑色,我們啟用深度測(cè)試,然后我們啟用優(yōu)化透視計(jì)算。

Procedure glInit();                     // 此處開始對(duì)OpenGL進(jìn)行所有設(shè)置
Begin
   If (Not LoadTexture) Then            // 調(diào)用紋理載入子例程
      exit;                             // 如果未能載入,退出

   glEnable(GL_TEXTURE_2D);             // 啟用紋理映射
   glShadeModel(GL_SMOOTH);             // 啟用陰影平滑
   glClearColor(0.0, 0.0, 0.0, 0.0);    // 黑色背景
   glClearDepth(1.0);                   // 設(shè)置深度緩存
   glEnable(GL_DEPTH_TEST);             // 啟用深度測(cè)試
   glDepthFunc(GL_LESS);                // 所作深度測(cè)試的類型
   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //高度優(yōu)化的透視投影計(jì)算

   //現(xiàn)在開始設(shè)置光源。下面下面一行設(shè)置環(huán)境光的發(fā)光量,
   //光源light1開始發(fā)光。
   //這一課的開始處我們我們將環(huán)境光的發(fā)光量存放在LightAmbient數(shù)組中。
   //現(xiàn)在我們就使用此數(shù)組(半亮度環(huán)境光)。
   glLightfv(GL_LIGHT1, GL_AMBIENT, @LightAmbient[0]); // 設(shè)置環(huán)境光
   //接下來我們?cè)O(shè)置漫射光的發(fā)光量。它存放在LightDiffuse數(shù)組中(全亮度白光)。
   glLightfv(GL_LIGHT1, GL_DIFFUSE, @LightDiffuse[0]); // 設(shè)置漫射光
   //然后設(shè)置光源的位置。
   //位置存放在 LightPosition 數(shù)組中
   //(正好位于木箱前面的中心,X-0.0,Y-0.0,Z方向移向觀察者2個(gè)單位<位于屏幕外面>)。
   glLightfv(GL_LIGHT1, GL_POSITION, @LightPosition); // 光源位置
   //最后,我們啟用一號(hào)光源。我們還沒有啟用GL_LIGHTING,
   //所以您看不見任何光線。
   //記?。褐粚?duì)光源進(jìn)行設(shè)置、定位、甚至啟用,光源都不會(huì)工作。
   //除非我們啟用GL_LIGHTING。
   glEnable(GL_LIGHT1);                 // 啟用一號(hào)光源

End;
//下一段代碼繪制貼圖立方體。我只對(duì)新增的代碼進(jìn)行注解。
//如果您對(duì)沒有注解的代碼有疑問,回頭看看第六課。

Procedure glDraw();                     // 從這里開始進(jìn)行所有的繪制
Begin
   glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度緩存
   glLoadIdentity();                    // 重置當(dāng)前的模型觀察矩陣

   //下三行代碼放置并旋轉(zhuǎn)貼圖立方體。
   //glTranslatef(0.0,0.0,z)將立方體沿著Z軸移動(dòng)Z單位。
   //glRotatef(xrot,1.0f,0.0f,0.0f)將立方體繞X軸旋轉(zhuǎn)xrot。
   //glRotatef(yrot,0.0f,1.0f,0.0f)將立方體繞Y軸旋轉(zhuǎn)yrot。
   glTranslatef(0.0, 0.0, z);           // 移入/移出屏幕 z 個(gè)單位
   glRotatef(xrot, 1.0, 0.0, 0.0);      // 繞X軸旋轉(zhuǎn)
   glRotatef(yrot, 0.0, 1.0, 0.0);      // 繞Y軸旋轉(zhuǎn)

   //下一行與我們?cè)诘诹n中的類似。
   //有所不同的是,這次我們綁定的紋理是texture[filter],
   //而不是上一課中的texture[0]。
   //任何時(shí)候,我們按下F鍵,filter 的值就會(huì)增加。
   //如果這個(gè)數(shù)值大于2,變量filter 將被重置為0。
   //程序初始時(shí),變量filter 的值也將設(shè)為0。
   //使用變量filter 我們就可以選擇三種紋理中的任意一種。
   glBindTexture(GL_TEXTURE_2D, texture[filter]); // 選擇由filter決定的紋理

   glBegin(GL_QUADS);                   // 開始繪制四邊形
   //glNormal3f是這一課的新東西。Normal就是法線的意思,
   //所謂法線是指經(jīng)過面(多邊形)上的一點(diǎn)且垂直于這個(gè)面(多邊形)的直線。
   //使用光源的時(shí)候必須指定一條法線。法線告訴OpenGL這個(gè)多邊形的朝向,并指明多邊形的正面和背面。
   //如果沒有指定法線,什么怪事情都可能發(fā)生:不該照亮的面被照亮了,多邊形的背面也被照亮....。
   //對(duì)了,法線應(yīng)該指向多邊形的外側(cè)??粗鞠涞那懊婺鷷?huì)注意到法線與Z軸正向同向。
   //這意味著法線正指向觀察者-您自己。這正是我們所希望的。
   //對(duì)于木箱的背面,也正如我們所要的,法線背對(duì)著觀察者。
   //如果立方體沿著X或Y軸轉(zhuǎn)個(gè)180度的話,前側(cè)面的法線仍然朝著觀察者,背面的法線也還是背對(duì)著觀察者。
   //換句話說,不管是哪個(gè)面,只要它朝著觀察者這個(gè)面的法線就指向觀察者。
   //由于光源緊鄰觀察者,任何時(shí)候法線對(duì)著觀察者時(shí),這個(gè)面就會(huì)被照亮。
   //并且法線越朝著光源,就顯得越亮一些。
   //如果您把觀察點(diǎn)放到立方體內(nèi)部,你就會(huì)法線里面一片漆黑。
   //因?yàn)榉ň€是向外指的。如果立方體內(nèi)部沒有光源的話,當(dāng)然是一片漆黑。
   // 前面
   glNormal3f(0.0, 0.0, 1.0);           // 法線指向觀察者
   glTexCoord2f(0.0, 0.0);
   glVertex3f(-1.0, -1.0, 1.0);         // 紋理和四邊形的左下
   glTexCoord2f(1.0, 0.0);
   glVertex3f(1.0, -1.0, 1.0);          // 紋理和四邊形的右下
   glTexCoord2f(1.0, 1.0);
   glVertex3f(1.0, 1.0, 1.0);           // 紋理和四邊形的右上
   glTexCoord2f(0.0, 1.0);
   glVertex3f(-1.0, 1.0, 1.0);          // 紋理和四邊形的左上
   // 后面
   glNormal3f(0.0, 0.0, -1.0);          // 法線背向觀察者
   glTexCoord2f(1.0, 0.0);
   glVertex3f(-1.0, -1.0, -1.0);        // 紋理和四邊形的右下
   glTexCoord2f(1.0, 1.0);
   glVertex3f(-1.0, 1.0, -1.0);         // 紋理和四邊形的右上
   glTexCoord2f(0.0, 1.0);
   glVertex3f(1.0, 1.0, -1.0);          // 紋理和四邊形的左上
   glTexCoord2f(0.0, 0.0);
   glVertex3f(1.0, -1.0, -1.0);         // 紋理和四邊形的左下
   // 頂面
   glNormal3f(0.0, 1.0, 0.0);           // 法線向上
   glTexCoord2f(0.0, 1.0);
   glVertex3f(-1.0, 1.0, -1.0);         // 紋理和四邊形的左上
   glTexCoord2f(0.0, 0.0);
   glVertex3f(-1.0, 1.0, 1.0);          // 紋理和四邊形的左下
   glTexCoord2f(1.0, 0.0);
   glVertex3f(1.0, 1.0, 1.0);           // 紋理和四邊形的右下
   glTexCoord2f(1.0, 1.0);
   glVertex3f(1.0, 1.0, -1.0);          // 紋理和四邊形的右上
   // 底面
   glNormal3f(0.0, -1.0, 0.0);          // 法線朝下
   glTexCoord2f(1.0, 1.0);
   glVertex3f(-1.0, -1.0, -1.0);        // 紋理和四邊形的右上
   glTexCoord2f(0.0, 1.0);
   glVertex3f(1.0, -1.0, -1.0);         // 紋理和四邊形的左上
   glTexCoord2f(0.0, 0.0);
   glVertex3f(1.0, -1.0, 1.0);          // 紋理和四邊形的左下
   glTexCoord2f(1.0, 0.0);
   glVertex3f(-1.0, -1.0, 1.0);         // 紋理和四邊形的右下
   // 右面
   glNormal3f(1.0, 0.0, 0.0);           // 法線朝右
   glTexCoord2f(1.0, 0.0);
   glVertex3f(1.0, -1.0, -1.0);         // 紋理和四邊形的右下
   glTexCoord2f(1.0, 1.0);
   glVertex3f(1.0, 1.0, -1.0);          // 紋理和四邊形的右上
   glTexCoord2f(0.0, 1.0);
   glVertex3f(1.0, 1.0, 1.0);           // 紋理和四邊形的左上
   glTexCoord2f(0.0, 0.0);
   glVertex3f(1.0, -1.0, 1.0);          // 紋理和四邊形的左下
   // 左面
   glNormal3f(-1.0, 0.0, 0.0);          // 法線朝左
   glTexCoord2f(0.0, 0.0);
   glVertex3f(-1.0, -1.0, -1.0);        // 紋理和四邊形的左下
   glTexCoord2f(1.0, 0.0);
   glVertex3f(-1.0, -1.0, 1.0);         // 紋理和四邊形的右下
   glTexCoord2f(1.0, 1.0);
   glVertex3f(-1.0, 1.0, 1.0);          // 紋理和四邊形的右上
   glTexCoord2f(0.0, 1.0);
   glVertex3f(-1.0, 1.0, -1.0);         // 紋理和四邊形的左上
   glEnd();

   xrot := xrot + xspeed;               // xrot 增加 xspeed 單位
   yrot := Yrot + yspeed;               // yrot 增加 yspeed 單位
End;

//現(xiàn)在轉(zhuǎn)入WinMain()主函數(shù)。
               //我們將在這里增加開關(guān)光源、旋轉(zhuǎn)木箱、切換過濾方式以及將木箱移近移遠(yuǎn)的控制代碼。
               //在接近WinMain()函數(shù)結(jié)束的地方你會(huì)看到SwapBuffers(hDC)這行代碼。
               //然后就在這一行后面添加如下的代碼。
               //代碼將檢查L鍵是否按下過。
               //如果L鍵已按下,但lp的值不是false的話,意味著L鍵還沒有松開,這時(shí)什么都不會(huì)發(fā)生。
               SwapBuffers(h_DC);       // 交換緩存 (雙緩存)

               If (keys[ord('L')] And Not lp) Then
                  Begin
                     //如果lp的值是false的話,
                     //意味著L鍵還沒按下,或者已經(jīng)松開了,接著lp將被設(shè)為TRUE。
                     //同時(shí)檢查這兩個(gè)條件的原因是為了防止L鍵被按住后,
                     //這段代碼被反復(fù)執(zhí)行,并導(dǎo)致窗體不停閃爍。
                     //lp設(shè)為true之后,計(jì)算機(jī)就知道L鍵按過了,
                     //我們則據(jù)此可以切換光源的開/關(guān):布爾變量light控制光源的開關(guān)。
                     lp := true;        // lp 設(shè)為 TRUE
                     light := Not light; // 切換光源的 TRUE/FALSE
                     If Not light Then  // 如果沒有光源
                        glDisable(GL_LIGHTING) //禁用光源
                     Else               // Otherwis
                        glEnable(GL_LIGHTING); //啟用光源
                  End;
               If Not keys[ord('L')] Then //L鍵松開了么?
                  lp := FALSE;          // 若是,則將lp設(shè)為FALSE

               //然后對(duì)"F"鍵作相似的檢查。
               //如果有按下"F"鍵并且"F"鍵沒有處于按著的狀態(tài)或者它就從沒有按下過,
               //將變量fp設(shè)為true。這意味著這個(gè)鍵正被按著呢。
               //接著將filter變量加一。如果filter變量大于2
               //(因?yàn)檫@里我們的使用的數(shù)組是texture[3],大于2的紋理不存在),
               //我們重置filter變量為0。
               If (keys[ord('F')] And Not fp) Then // F鍵按下了么?
                  Begin
                     fp := TRUE;        // fp 設(shè)為 TRUE
                     inc(filter);       // filter的值加一
                     If filter > 2 Then // 大于2了么?
                        filter := 0;    // 若是重置為0
                  End;
               If Not keys[ord('F')] Then //F鍵放開了么?
                  fp := FALSE;          // 若是fp設(shè)為FALSE

               //這四行檢查是否按下了PageUp鍵。若是的話,減少z變量的值。這樣DrawGLScene函數(shù)中包含的glTranslatef(0.0f,0.0f,z)調(diào)用將使木箱離觀察者更遠(yuǎn)一點(diǎn)。
               If keys[VK_PRIOR] Then   //PageUp按下了?
                  z := z - 0.02;        // 若按下,將木箱移向屏幕內(nèi)部。
               //接著四行檢查PageDown鍵是否按下,若是的話,增加z變量的值。這樣DrawGLScene函數(shù)中包含的glTranslatef(0.0f,0.0f,z)調(diào)用將使木箱向著觀察者移近一點(diǎn)。
               If keys[VK_NEXT] Then    // PageDown按下了么?
                  z := z + 0.02;        //若按下的話,將木箱移向觀察者。

               //現(xiàn)在檢查方向鍵。按下左右方向鍵xspeed相應(yīng)減少或增加。
               //按下上下方向鍵yspeed相應(yīng)減少或增加。
               //記住在以后的教程中如果xspeed、yspeed的值增加的話,立方體就轉(zhuǎn)的更快。
               //如果一直按著某個(gè)方向鍵,立方體會(huì)在那個(gè)方向上轉(zhuǎn)的越快。
               If keys[VK_UP] Then      // Up方向鍵按下了么?
                  xspeed := xspeed - 0.01; //若是,減少xspeed
               If keys[VK_DOWN] Then    //Down方向鍵按下了么?
                  xspeed := xspeed + 0.01; //若是,增加xspeed
               If keys[VK_RIGHT] Then   //Right方向鍵按下了么?
                  yspeed := yspeed + 0.01; //若是,增加yspeed
               If keys[VK_LEFT] Then    //Left方向鍵按下了么?
                  yspeed := yspeed - 0.01; //若是, 減少yspeed

               If (keys[VK_ESCAPE]) Then // 如果按下了ESC鍵
                  finished := True


上一篇:正確看待《Delphi高手突破》最后一章的實(shí)例

下一篇:打造Delphi中字符串的replace函數(shù)

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

国产精品一区二区入口九绯色| 国产精品成人免费一区二区视频| 亚洲aⅴ优女av综合久久久| 成年女人a毛片免费视频| 国产精品天天狠天天看| 懂色av蜜臀av粉嫩av喷吹| 影音先锋男人在线资源| 黄色www网站| 日韩电影在线观看完整免费观看| a天堂中文在线官网| www.亚洲精品| 3d动漫精品啪啪一区二区竹菊| 波波电影院一区二区三区| 在线综合欧美| www.日本视频| 欧美三根一起进三p| 国产鲁鲁视频在线观看免费| 欧美性猛交xxxx乱| 久久精品国产68国产精品亚洲| 国产夫妻在线观看| 伊人亚洲精品| 福利电影一区二区| 亚洲精品福利视频网站| 91久久爱成人| 日韩免费一级视频| 欧洲vodafonewi精品| 亚洲欧美日本一区二区| 黄色av电影在线播放| 国产最新精品| 91视频免费在线观看| 免费亚洲电影在线| 色中色综合成人| 国产精品区一区| 亚洲免费网站在线观看| 蜜桃传媒麻豆第一区在线观看| 高清hd写真福利在线播放| 欧美极品jizzhd欧美仙踪林| 日本调教视频在线观看| 国产野外作爱视频播放| 黄色免费一级视频| 成人性生活视频| 欧美野外性xxxxfeexxxx| www.国产精品一二区| 一区二区电影在线观看| 日韩精品福利网| 日韩在线观看电影完整版高清免费| 亚洲最新永久在线观看| 欧美性生交片4| 久草网视频在线观看| 国精产品一区一区三区mba桃花| 蜜桃91精品入口| 青青青在线播放| 国产日产精品一区二区三区四区的观看方式| 国产在线精品观看| 欧美大波大乳巨大乳| 波多野结衣片子| 久久无码高潮喷水| 欧美日产国产成人免费图片| 国产二区精品| 久草精品电影| 天干夜夜爽爽日日日日| 欧美成人二区| 国产日韩精品中文字无码| 91中文精品字幕在线视频| 久久久久久亚洲中文字幕无码| 日本二区视频| 久久久久久久久久久一区| 亚洲免费精彩视频| 1024精品久久久久久久久| 天堂va久久久噜噜噜久久va| 欧美一区二区三区四区视频| 亚洲精品国偷自产在线99热| 老牛影视av老牛影视av| 99tv成人| 国产精品美女一区二区在线观看| 四虎影院在线域名免费观看| 久久久国产精品网站| 国产一区二区三区播放| 黑人极品videos精品欧美裸| 99在线免费视频观看| 天堂va蜜桃一区二区三区| 欧美综合国产精品久久丁香| 伊人免费视频| 国内精品卡一卡二卡三| 99re亚洲国产精品| 992tv国产精品成人影院| 欧美日韩精品一区二区视频| 小说区亚洲自拍另类图片专区| 久久久久国产精品视频| 亚洲字幕一区二区| 欧美一级在线观看| 性欧美videos白嫩| 亚洲精品美女网站| 99久久久精品| 国产在线久久久| 日韩在线观看电影完整版高清免费| 3d精品h动漫啪啪一区二区| 奇米影视一区二区三区| 99久久精品久久久久久清纯| 91传媒理伦片在线观看| 成人精品一区二区三区四区| 中文字幕一区二区三区四区不卡| 国产精品国产福利国产秒拍| 蜜芽在线免费观看| 国内精品久久久久国产盗摄免费观看完整版| 国产一区二区亚洲| 亚洲人a成www在线影院| 少妇高潮一区二区三区喷水| 极品少妇一区二区| 国产激情精品久久久第一区二区| 亚洲国产精品毛片av不卡在线| 国产乱子精品一区二区在线观看| 久久久91精品| 无码人妻精品一区二区三区99v| 色三级在线观看| 免费在线午夜视频| 色婷婷激情视频| 亚洲精品www久久久久久广东| 国产精品爽黄69天堂a| chinesegaysextube| 日日躁夜夜躁aaaabbbb| 亚洲免费在线观看视频| 国产蜜臀一区二区打屁股调教| 国产91在线|亚洲| 成人在线视频一区二区三区| 春日野结衣av| 日本中文字幕高清视频| 日韩电影毛片| 三上悠亚在线免费观看| 天天操夜夜拍| 濑亚美莉vs黑人在线观看| 国产区在线观看视频| 人人鲁人人莫人人爱精品| 欧美v国产在线一区二区三区| 性一交一乱一色一视频麻豆| 欧美专区视频| 91人妻一区二区三区| 久久久久久亚洲精品杨幂换脸| 2021av在线| 欧美成人精品高清在线播放| 欧美成人黄色网| 国产精品亚洲综合在线观看| 国产精品资源站在线| 日本aⅴ亚洲精品中文乱码| www亚洲一区| 国产精品一区二区日韩| 伊人狠狠色丁香综合尤物| 在线精品自拍| 丁香六月色婷婷| 国产一区二区三区四区在线观看| 欧美一区二区.| 欧美久久电影| 欧美精品一区二区三区视频| 欧美人乱大交xxxxx| 欧美高清性xxxxxxx| 国产喷水在线观看| 亚洲一区二区三区在线免费| 日韩国产精品视频| 日韩欧美国产综合| 亚洲欧洲99久久| 久久黄色级2电影| 国产精品免费视频观看| 麻豆成人综合网| 四虎影视国产在线视频| 中文字幕免费在线看线人动作大片| av在线导航| 日本不卡一区二区三区在线观看| 日韩欧美一级视频| 成人性生交大片免费看视频在线| 久久久久久久久亚洲精品| 亚洲男人都懂的网站| 免费男女羞羞的视频网站在线观看| 天天草夜夜草| 黄色免费在线观看| 日韩欧美视频在线播放| 日韩人妻无码一区二区三区| 国产欧美精品一二三| 欧美日韩视频网站| av午夜在线观看| 中文字字幕在线中文| 国产精品久久99久久| 日韩在线观看视频免费| h片在线播放| 亚洲综合av网| 午夜精品aaa| 男人j进女人j| 亚洲精品黄网在线观看| 欧美啪啪小视频| 成人小说亚洲一区二区三区| 成人免费视频caoporn| 亚洲丝袜制服诱惑| h视频在线免费观看| 国产精品免费视频xxxx| 欧美另类videosbest视频| 玖玖精品一区| 欧美肥胖老妇做爰| 亚洲欧美日韩动漫| 国产日韩成人精品| 美国一级黄色录像| 美女久久久久久久久久久| 久久精品99国产国产精| 天堂中文av在线| 久久久另类综合| 最新国产露脸在线观看| 亚洲免费在线精品一区| jlzzjlzz亚洲女人18| 国产午夜福利一区| 国产秒拍福利视频露脸| 欧美激情在线狂野欧美精品| 成人av网站在线| 九九热只有这里有精品| 任我爽在线视频精品一| 在线观看视频网站你懂得| 国产精品情侣呻吟对白视频| 日韩欧美伦理电影院| 成人性生交大片免费看视频在线| 国产精品18久久久久网站| 欧美一区二区三区系列电影| 热久久免费视频精品| 噜噜噜久久亚洲精品国产品麻豆| 亚洲精品一区二区妖精| 国产精品无码久久久久| 亚洲欧美日韩高清在线| 成人综合在线观看| 日韩av三级在线观看| 亚洲一区二区三区久久久| 成人免费av资源| 天天操天天操天天操| 在线不卡的av| 色悠久久久久综合网小说| 一级毛片电影| 亚洲色图美腿丝袜| 中文字幕在线播放不卡一区| 国产精品22p| 亚洲精品综合久久中文字幕| 国产91在线免费| 国产最新精品免费| 在线中文字幕一区| 日本激情视频网站| 欧美香蕉爽爽人人爽| 国产日韩欧美另类| 少妇被狂c下部羞羞漫画| 午夜爽爽爽男女免费观看影院| 97av在线播放| 自拍视频在线免费观看| 亚洲一级二级三级| 日日夜夜精品视频| 韩国午夜理伦三级不卡影院| 久久97久久97精品免视看秋霞| 26uuu色噜噜精品一区二区| 蜜桃视频在线一区| 天天射综合影视| 国产日韩精品视频一区二区三区| 手机看片福利在线观看| 日本精品视频在线观看| 九九热视频免费在线观看| av电影天堂一区二区在线| 91黄色免费视频| 日韩欧美国产精品综合嫩v| 福利小视频在线| 91精品一区二区三区综合在线爱| 91精品国自产| 亚洲女同志亚洲女同女播放| 人妻巨大乳一二三区| 日韩视频在线一区二区三区| 麻豆蜜桃在线| 日韩免费三级| 牛牛视频精品一区二区不卡| 在线激情免费视频| 国产毛片精品国产一区二区三区| www亚洲人| 日韩精品一区二区av| 精品久久美女| 国产精品免费丝袜| 美日韩精品视频免费看| 黑人精品欧美一区二区蜜桃| 欧美一级片黄色| 国产精品无圣光一区二区| 一本一道dvd在线观看免费视频| 亚洲第一在线综合网站| 国产精品无码电影在线观看| 成年网在线观看免费观看网址| 久9re热视频这里只有精品| 爽死777影院| 亚洲精品电影久久久| 国产一区二区三区观看| 91久久偷偷做嫩草影院电| 中国日本在线视频中文字幕| 美女视频一区在线观看| 国产又粗又长又硬| 亚洲色图网友自拍| 96国产粉嫩美女| 91精品人妻一区二区三区蜜桃欧美| 亚洲视频一二三| 亚洲色成人www永久网站| 香蕉视频在线观看免费| 成人免费无遮挡| 日本不卡一区二区在线观看| 欧美亚洲高清一区二区三区不卡| 国产欧美精品一二三| 变态调教一区二区三区| 成人一区二区三区中文字幕| 久久新电视剧免费观看| 97福利一区二区| 亚洲成人三级在线| 久久99久久久精品欧美| 日韩一区二区三免费高清| 极品av少妇一区二区| 色18美女社区| 黄色免费网站在线| 国产日韩欧美91| 三上悠亚免费在线观看| 国产亚洲欧洲高清一区| 国产精品第3页| 精品999日本久久久影院| 成人午夜免费剧场| 欧美日韩精品一区二区视频| www.av在线.com| 激情成人在线观看| 天天干天天操天天爽| 久久久精品欧美| 香蕉视频禁止18| 亚洲精品www久久久久久广东| 日批视频免费观看| 九九九九九九九九| 大地资源网在线观看免费官网| 成人免费毛片片v| 欧美黄页免费|