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

首頁 > 編程 > Delphi > 正文

NeHe的opengl教程delphi版(6)----紋理映射(貼圖)

2019-11-18 18:32:36
字體:
來源:轉載
供稿:網友
 

{

貼圖可以極大的節省CPU時間。呵呵,但是這一節費了我比較多的時間 : (

因為用到了opengl的輔助庫,現在這個庫的函數已經很少有人用了,但是我還是找到了,感謝zdcnow(磁效應),他給我提供的這個輔助庫的delphi版本。在學習本節之前,請大家到網上下載glaux.dll、Glaux.pas文件,并加到項目中。

好了,讓我們繼續OPENGL之路.

首先我們需要加進SysUtils單元,因為我們這節要用到文件操作,我們還要將Glaux單元加進來。

然后我們在第一課的基礎上加上幾個變量,xrot , yrot 和 zrot 。這些變量用來使立方體繞X、Y、Z軸旋轉。texture[] 為一個紋理分配存儲空間。如果您需要不止一個的紋理,應該將數字1改成您所需要的數字。

}

VAR

   h_RC             : HGLRC;            // Rendering Context(著色描述表)。
   h_DC             : HDC;              // Device Context(設備描述表)
   h_Wnd            : HWND;             // 窗口句柄
   h_Instance       : HINST;            // 程序Instance(實例)。
   keys             : Array[0..255] Of Boolean; // 用于鍵盤例程的數組

   xrot,                                // X 旋轉量 ( 新增 )
   yrot,                                // Y 旋轉量 ( 新增 )
   zrot             : GLfloat;          // Z 旋轉量 ( 新增 )

  Texture          : Array[0..1] Of GLuint; // 存儲一個紋理 ( 新增 )

{然后引載入opengl32.dll中的兩個過程,我們要用到他們}


PRocedure glGenTextures(n: GLsizei; Var textures: GLuint); stdcall; external
   opengl32;
Procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external
   opengl32;

{接下來我們需要增加一個新的函數,用來再入圖像,該函數的返回類型在Glaux.pas中定義如下:

TAUX_RGBImageRec= record
       sizeX, sizeY: GLint;
        data: pointer;
          end;
 PTAUX_RGBImageRec= ^TAUX_RGBImageRec;

具體含義會在后面介紹}

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);         // 關閉句柄
         //auxDIBImageLoad(Filename) 讀取圖象數據并將其返回。
         result := auxDIBImageLoadA(filename); //載入位圖并返回指針
      End
   Else
      //如果我們不能打開文件,我們將返回NiL。
      result := Nil;                    // 如果載入失敗,返回NiL。
End;

//接下來在創建一個新函數,用來載入紋理貼圖

Function LoadTexture: boolean;

//Status 的變量。我們使用它來跟蹤是否能夠載入位圖以及能否創建紋理。
// Status 缺省設為 FALSE (表示沒有載入或創建任何東東)。
//TextureImage變量PTAUX_RGBImageRec類型  存儲位圖的圖像記錄。
//次記錄包含位圖的寬度、高度和數據。

Var
   Status           : boolean;
   TextureImage     : Array[0..1] Of PTAUX_RGBImageRec;
Begin
   Status := false;
   ZeroMemory(@TextureImage, sizeof(TextureImage)); // 將指針設為 NULL
   TextureImage[0] := LoadBMP('Texture.bmp');
   If TextureImage[0] <> Nil Then
      Begin
         Status := TRUE;                // 將 Status 設為 TRUE
         //現在使用中 TextureImage[0] 的數據創建紋理。
         //glGenTextures(1, texture[0]) 告訴OpenGL我們想生成一個紋理名字
         //(如果您想載入多個紋理,加大數字)。
         //glBindTexture(GL_TEXTURE_2D, texture[0]) 告訴OpenGL將紋理名字 texture[0] 綁定到紋理目標上。
         //2D紋理只有高度(在 Y 軸上)和寬度(在 X 軸上)。
         //主函數將紋理名字指派給紋理數據。
         //本例中我們告知OpenGL, &texture[0] 處的內存已經可用。
         //我們創建的紋理將存儲在 &texture[0] 的 指向的內存區域。
         glGenTextures(1, texture[0]);  // 創建紋理
         glBindTexture(GL_TEXTURE_2D, texture[0]);  // 使用來自位圖數據生成 的典型紋理
         //下來我們創建真正的紋理。
         //下面一行告訴OpenGL此紋理是一個2D紋理 ( GL_TEXTURE_2D )。
         //數字零代表圖像的詳細程度,通常就由它為零去了。
         //數字三是數據的成分數。因為圖像是由紅色數據,綠色數據,藍色數據三種組分組成。
         //TextureImage[0].sizeX 是紋理的寬度。
         //如果您知道寬度,您可以在這里填入,但計算機可以很容易的為您指出此值。
         // TextureImage[0].sizey 是紋理的高度。
         //數字零是邊框的值,一般就是零。
         // GL_RGB 告訴OpenGL圖像數據由紅、綠、藍三色數據組成。
         //GL_UNSIGNED_BYTE 意味著組成圖像的數據是無符號字節類型的。
         //最后... TextureImage[0].data 告訴OpenGL紋理數據的來源。
         //此例中指向存放在 TextureImage[0] 記錄中的數據。

         // 生成紋理
         glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0].sizeX,
            TextureImage[0].sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE,
            TextureImage[0].data);

         //下面的兩行告訴OpenGL在顯示圖像時,
         //當它比放大得原始的紋理大(GL_TEXTURE_MAG_FILTER)
         //或縮小得比原始得紋理小(GL_TEXTURE_MIN_FILTER)時OpenGL采用的濾波方式。
         //通常這兩種情況下我都采用 GL_LINEAR。這使得紋理從很遠處到離屏幕很近時都平滑顯示。
         //使用 GL_LINEAR需要CPU和顯卡做更多的運算。
         //如果您的機器很慢,您也許應該采用 GL_NEAREST 。
         //過濾的紋理在放大的時候,看起來斑駁的很(馬賽克啦)。
         //您也可以結合這兩種濾波方式。在近處時使用 GL_LINEAR ,遠處時 GL_NEAREST 。
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);  // 線形濾波
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);  // 線形濾波
      End;
   //現在我們釋放前面用來存放位圖數據的內存。
   //我們先查看位圖數據是否存放在處。
   //如果是的話,再查看數據是否已經存儲。
   //如果已經存儲的話,刪了它。
   //接著再釋放 TextureImage[0] 圖像結構以保證所有的內存都能釋放。
   If assigned(TextureImage[0]) Then    // 紋理是否存在
      If assigned(TextureImage[0].data) Then // 紋理圖像是否存在
         TextureImage[0].data := Nil;   // 釋放紋理圖像占用的內存
   TextureImage[0] := Nil;              // 釋放圖像結構
   // 最后返回狀態變量。如果一切OK,變量 Status 的值為 TRUE 。否則為 FALSE
   result := Status;                    // 返回 Status
End;


上一篇:在Delphi中自己建立交叉表

下一篇:正確看待《Delphi高手突破》最后一章的實例

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区视频在线观看| 91久久嫩草影院一区二区| 欧美成人午夜剧场免费观看| 亚洲一区二区久久| 欧美网站在线观看| 日韩中文理论片| 91性高湖久久久久久久久_久久99| 国产z一区二区三区| 亲爱的老师9免费观看全集电视剧| 欧美专区国产专区| 日韩综合中文字幕| 日韩有码片在线观看| 97色在线视频| 精品国产一区二区三区久久久| 国产一区二区三区在线观看网站| 欧美性色视频在线| 国产精品久久9| 亚洲精品视频网上网址在线观看| 日韩欧美成人网| 亚洲一级黄色片| 亚洲国产精久久久久久久| 久久久亚洲福利精品午夜| 日本老师69xxx| 日韩大片免费观看视频播放| 国产91在线播放九色快色| 97涩涩爰在线观看亚洲| 中文欧美在线视频| 91国在线精品国内播放| 欧美精品一区在线播放| 成人黄色生活片| 亚洲成人精品视频| 日韩**中文字幕毛片| 18一19gay欧美视频网站| 精品久久久国产| 国产精品久久久久久久久久小说| 91夜夜未满十八勿入爽爽影院| 欧美丝袜第一区| 亚洲黄色www网站| 羞羞色国产精品| 日韩美女毛茸茸| 九九热视频这里只有精品| 神马久久桃色视频| 国产一区二区久久精品| 日韩在线观看成人| 亚洲国产精品资源| 国产精品视频免费在线观看| 国产成人精品综合| 欧美老少配视频| 欧美性xxxx极品hd满灌| 欧美精品18videos性欧| 日本高清+成人网在线观看| 国产精品美腿一区在线看| 亚洲第一偷拍网| 在线观看中文字幕亚洲| 国产高清在线不卡| 欧美丰满老妇厨房牲生活| 伊人久久久久久久久久久久久| 日韩av在线最新| 欧洲日韩成人av| 不卡中文字幕av| 成人欧美一区二区三区黑人| 亚洲wwwav| 亚洲成人1234| 久久精品91久久久久久再现| 亚洲九九九在线观看| 亚洲护士老师的毛茸茸最新章节| 亚洲另类欧美自拍| 色综合视频一区中文字幕| 亚洲乱码国产乱码精品精| 欧美大片免费观看在线观看网站推荐| 亚洲丝袜一区在线| 精品香蕉在线观看视频一| 免费99精品国产自在在线| 色狠狠av一区二区三区香蕉蜜桃| 欧美丰满少妇xxxx| 亚洲欧美日韩精品| 91久久久亚洲精品| 中文字幕亚洲无线码在线一区| 亚洲国产99精品国自产| 亚洲人精选亚洲人成在线| 九九精品在线观看| 秋霞午夜一区二区| 亚洲免费伊人电影在线观看av| 欧美老少配视频| 国产一区二区黄| 亚洲成人激情小说| 国产91精品网站| 久久久久女教师免费一区| 国产精品自拍网| 91国产精品91| 国产suv精品一区二区| 国产精品日韩在线一区| 91在线视频免费| 国产91久久婷婷一区二区| 成人国产精品一区| 91精品国产精品| 久久99国产综合精品女同| 久久精品99国产精品酒店日本| 欧美电影院免费观看| 国产在线观看91精品一区| 欧美精品免费播放| 91sao在线观看国产| 久久中国妇女中文字幕| 日韩av成人在线观看| 欧美激情亚洲综合一区| 另类天堂视频在线观看| 精品偷拍一区二区三区在线看| 亚洲在线免费视频| 久久国产精品久久久久久| 欧美怡春院一区二区三区| 欧美精品久久久久久久免费观看| 国产欧美日韩丝袜精品一区| 日本精品一区二区三区在线播放视频| 尤物yw午夜国产精品视频| 91精品国产综合久久香蕉的用户体验| 成人羞羞国产免费| 久久综合久久88| 国产精品毛片a∨一区二区三区|国| 国产精品爱啪在线线免费观看| 日韩欧美国产高清91| 成人国产精品一区二区| 欧美亚洲一级片| 亚洲第一视频网| 国内精品小视频| 国产欧美一区二区三区在线| 亚洲大胆人体av| 国产成人+综合亚洲+天堂| 91在线视频精品| 91精品国产综合久久香蕉的用户体验| 性欧美办公室18xxxxhd| 国产精品永久免费观看| 97涩涩爰在线观看亚洲| 欧美极品少妇全裸体| 免费成人高清视频| 国产精品久久中文| 亚洲三级av在线| 成人国产精品一区| 亚洲一区二区国产| 亚洲欧美中文在线视频| 日韩国产欧美精品在线| 亚洲视屏在线播放| 精品一区二区三区四区在线| 亚洲精品一区在线观看香蕉| 久久99精品久久久久久噜噜| 国产成人avxxxxx在线看| 成人黄色av免费在线观看| 91亚洲午夜在线| 91久久在线观看| 精品网站999www| 91视频免费网站| 欧美日韩xxxxx| 亚洲网站在线播放| 日本中文字幕不卡免费| 欧美日韩一区二区在线| 国产一区二区三区三区在线观看| 欧美成人精品激情在线观看| 久久久伊人欧美| 欧美电影免费观看| 国产成人精品日本亚洲专区61| 欧美精品少妇videofree| 午夜伦理精品一区| 精品国产91久久久| 欧美亚州一区二区三区| 日韩中文字幕视频在线观看|