国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > Delphi > 正文

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

2019-11-18 18:32:36
字體:
來源:轉載
供稿:網(wǎng)友
 

{

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

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

好了,讓我們繼續(xù)OPENGL之路.

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

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

}

VAR

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

   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;

{接下來我們需要增加一個新的函數(shù),用來再入圖像,該函數(shù)的返回類型在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) 讀取圖象數(shù)據(jù)并將其返回。
         result := auxDIBImageLoadA(filename); //載入位圖并返回指針
      End
   Else
      //如果我們不能打開文件,我們將返回NiL。
      result := Nil;                    // 如果載入失敗,返回NiL。
End;

//接下來在創(chuàng)建一個新函數(shù),用來載入紋理貼圖

Function LoadTexture: boolean;

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

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
         //現(xiàn)在使用中 TextureImage[0] 的數(shù)據(jù)創(chuàng)建紋理。
         //glGenTextures(1, texture[0]) 告訴OpenGL我們想生成一個紋理名字
         //(如果您想載入多個紋理,加大數(shù)字)。
         //glBindTexture(GL_TEXTURE_2D, texture[0]) 告訴OpenGL將紋理名字 texture[0] 綁定到紋理目標上。
         //2D紋理只有高度(在 Y 軸上)和寬度(在 X 軸上)。
         //主函數(shù)將紋理名字指派給紋理數(shù)據(jù)。
         //本例中我們告知OpenGL, &texture[0] 處的內存已經(jīng)可用。
         //我們創(chuàng)建的紋理將存儲在 &texture[0] 的 指向的內存區(qū)域。
         glGenTextures(1, texture[0]);  // 創(chuàng)建紋理
         glBindTexture(GL_TEXTURE_2D, texture[0]);  // 使用來自位圖數(shù)據(jù)生成 的典型紋理
         //下來我們創(chuàng)建真正的紋理。
         //下面一行告訴OpenGL此紋理是一個2D紋理 ( GL_TEXTURE_2D )。
         //數(shù)字零代表圖像的詳細程度,通常就由它為零去了。
         //數(shù)字三是數(shù)據(jù)的成分數(shù)。因為圖像是由紅色數(shù)據(jù),綠色數(shù)據(jù),藍色數(shù)據(jù)三種組分組成。
         //TextureImage[0].sizeX 是紋理的寬度。
         //如果您知道寬度,您可以在這里填入,但計算機可以很容易的為您指出此值。
         // TextureImage[0].sizey 是紋理的高度。
         //數(shù)字零是邊框的值,一般就是零。
         // GL_RGB 告訴OpenGL圖像數(shù)據(jù)由紅、綠、藍三色數(shù)據(jù)組成。
         //GL_UNSIGNED_BYTE 意味著組成圖像的數(shù)據(jù)是無符號字節(jié)類型的。
         //最后... TextureImage[0].data 告訴OpenGL紋理數(shù)據(jù)的來源。
         //此例中指向存放在 TextureImage[0] 記錄中的數(shù)據(jù)。

         // 生成紋理
         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;
   //現(xiàn)在我們釋放前面用來存放位圖數(shù)據(jù)的內存。
   //我們先查看位圖數(shù)據(jù)是否存放在處。
   //如果是的話,再查看數(shù)據(jù)是否已經(jīng)存儲。
   //如果已經(jīng)存儲的話,刪了它。
   //接著再釋放 TextureImage[0] 圖像結構以保證所有的內存都能釋放。
   If assigned(TextureImage[0]) Then    // 紋理是否存在
      If assigned(TextureImage[0].data) Then // 紋理圖像是否存在
         TextureImage[0].data := Nil;   // 釋放紋理圖像占用的內存
   TextureImage[0] := Nil;              // 釋放圖像結構
   // 最后返回狀態(tài)變量。如果一切OK,變量 Status 的值為 TRUE 。否則為 FALSE
   result := Status;                    // 返回 Status
End;


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

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

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

新聞熱點

疑難解答

圖片精選

網(wǎng)友關注

国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产精品视频h| 国产视频1区| 国产精品黄页网站在线播放免费| 国产天堂在线| 国产乱在线观看视频| 二区三区中文字幕| 国产美女在线一区二区三区| 日韩亚洲一区中文字幕| 欧洲一区av| 国产精品一区牛牛影视| 国产精品作爱| 精品亚洲综合| 精品久久亚洲一级α| 久久久久久国产视频| 伊人网站在线| 看成年女人免费午夜视频| 久草网在线视频| 国产三级免费观看| 国产天堂资源| 青草在线视频在线观看| 国产精品一区二区资源| 国产小视频在线| av手机天堂| 国产三级香港三韩国三级| av日韩国产| 国产探花在线观看| 欧美性猛交xxxx免费看久久| 国产精品免费麻豆入口| 日本亚洲精品| www.色五月| 日本在线观看| 国产大学生粉嫩无套流白浆| wwwww在线观看免费视频| 久久99亚洲网美利坚合众国| 国产一二区视频| 老司机在线视频二区| 尤物在线视频观看| 高清色视频在线观看| eeuss影院在线观看第一页| 国产网红女主播精品视频| 黄网在线免费| 亚洲va国产日韩欧美精品色婷婷| 日本中文字幕视频| 久久91精品视频| 久艹在线视频| 国产在线观看91| 精品孕妇一区二区三区| 国产在线看片| 精品久久九九| 精品电影在线| 中文在线观看视频| 在线天堂av| 夜夜操天天干| 欧美日韩一区二区三区在线播放 | 中文字幕av免费| 国产www.大片在线| 国产精品xxx电影| 97操碰视频| 午夜在线视频播放| 狠狠色综合久久婷婷| 五月婷婷导航| 免费一区二区在线观看| 亚洲日本一区二区三区在线观看| 亚洲欧洲成人| 国产在线你懂得| 国产视频福利| av在线不卡播放| 五月婷婷在线视频| 亚洲成人av高清| 久热中文字幕精品视频在线| 午夜av在线播放| 在线国产一区二区三区| 九七电影韩国女主播在线观看| 快射av在线播放一区| 51成人精品网站| 国内精品不卡| 91欧洲在线视精品在亚洲| www.操.com| 精品视频一二区| 午夜国产视频| 四虎精品视频| 国产成a人亚洲精v品| 蜜桃视频中文字幕| 91国内精品在线视频| 国产女呦网站| 麻豆国产视频| 亚洲天堂影院在线观看| 日本中文字幕视频在线| 国产二区在线播放| 超碰免费在线播放| a视频免费看| av超碰在线| 国产黄色在线看| 午夜视频在线| 中文字幕在线观看av| wwww在线观看| xxx国产精品| 四虎国产精品永久在线| 精品日韩av| 91精品国产91久久久久久青草| 中文字幕网在线| 国产一级免费黄色片| 中文字幕高清av| 青青九九免费视频在线| av中文字幕在线看| eeuss影院网站免费观看| 亚洲天堂久久久| 在线观看免费高清完整| 在线观看精品视频一区二区三区 | free性亚洲| 人人在线视频| 狠狠干五月天| 综合激情亚洲| 国产激情三区| 四虎成人免费观看在线网址| 亚洲国产日韩成人综合天堂| 在线中文字幕视频| 四虎精品视频| 天堂资源在线中文| 国产精品麻豆一区二区三区 | 国产三级视频在线看| 国产福利在线| www.99av| 国产人成在线观看| 在线色视频观看| 日本福利午夜视频在线| 国产免费黄网站| 国产传媒在线播放| 欧美日韩在线视频免费观看| 久热国产在线| 在线中文资源天堂| 交换国产精品视频一区| 国产盗摄一区二区| 狠狠插狠狠操| 99热免费在线| 国产探花在线观看| 开心婷婷激情五月| 影音av资源站| 国产人成精品| 国产在线观看91| 香蕉视频在线观看www| 国产区在线视频| 国内自拍视频在线看免费观看| 精品视频在线一区二区| 欧美黑人乱大交ⅹxxxxx| 国产福利在线看| 中文字幕久热在线精品| 超碰在线中文| japanese色国产在线看视频| 国产图片综合| 国产一区在线视频观看| sm国产在线调教视频| 伊人伊人av电影| 91看片在线观看| 国产精品666| 国产一级黄色电影| 国产蜜臀在线| 狠狠操视频网站| 久草视频国产| 天天激情综合| 欧美午夜电影一区二区三区| 四虎成人免费观看在线网址| 99中文字幕一区| 天堂√中文在线| xxx国产精品| 久久精品无码一区二区日韩av| 夜夜爽视频导航| 亚洲精品aaaa| 欧美色第一页| 国产一级免费| 97高清视频| 亚洲jjzzjjzz在线观看| 免费一区二区三区视频狠狠| 九九热视频免费在线观看| 免费的黄网站在线观看| 超碰在线影院| 中文字幕在线视频不卡| 国产成在线观看免费视频| 99久久免费精品国产免费| 在线天堂av| 好吊日视频在线观看| 国产视频中文字幕在线观看| 97在线超碰| 精品中文字幕不卡在线视频| 午夜国产在线| √天堂8资源中文在线| 人日人天天爽| 国产精品666| 日本国产在线| 国产在线高潮| 99久久99热久久精品免费看| 国产女呦网站| 日本视频在线| 国产视频第一区| 91青青在线视频| 好看的中文字幕在线播放| 久热精品免费视频| 欧美色第一页| 中文在线官网天堂| 国产农村一级特黄α**毛片|