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

首頁 > 編程 > Delphi > 正文

NeHe的opengl教程delphi版(1)----基本框架

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

將CKER翻譯的NeHe的VC 的OPENGL框架轉(zhuǎn)成了Delphi版,
希望對用Delphi學(xué)習(xí)OPENGL的兄弟有所幫助,
不知為什么,我的Delphi環(huán)境下無法直接運(yùn)行,但是在別的機(jī)器上好像沒問題
我的機(jī)器只能編譯后運(yùn)行EXE文件。
感謝NeHe提供的這么好的框架,感謝CKER翻譯的VC的資料

 

PRogram Project1;

Uses
   opengl,
   windows,
   Messages;

Const
   WND_TITLE        = 'OPenGl 基本框架'; //標(biāo)題
Var
   //===========================================================================
   // 每一個OpenGL都被連接到一個著色描述表上。著色描述表將所有的OpenGL調(diào)用命令連
   // 接到Device Context(設(shè)備描述表)上,將OpenGL的著色描述表定義為hRC ,要讓程序能
   // 夠繪制窗口的話,還需要創(chuàng)建一個設(shè)備描述表,Windows的設(shè)備描述表被定義為 hDC,
   // DC將窗口連接到GDI(Graphics Device Interface圖形設(shè)備接口)。而RC將OpenGL連接
   // 到DC。
   //===========================================================================
   h_RC             : HGLRC;            // Rendering Context(著色描述表)。
   h_DC             : HDC;              // Device Context(設(shè)備描述表)
   h_Wnd            : HWND;             // 窗口句柄
   h_Instance       : HINST;            // 程序Instance(實例)。
   keys             : Array[0..255] Of Boolean; // 用于鍵盤例程的數(shù)組
   {$R *.res}

   //==============================================================================
   //重新設(shè)置OpenGL場景的大小,而不管窗口的大小是否已經(jīng)改變(假定沒有使用全屏模式)。
   //甚至無法改變窗口的大小時(例如在全屏模式下),它至少仍將運(yùn)行一次————————
   //在程序開始時設(shè)置透視圖。OpenGL場景的尺寸將被設(shè)置成它顯示時所在窗口的大小。
   //==============================================================================

Procedure glResizeWnd(Width, Height: Integer); // 重置并初始化GL窗口大小
Begin
   If (Height = 0) Then                 // 防止高度為0,產(chǎn)生除0異常
      Height := 1;
   glViewport(0, 0, Width, Height);     // 重置當(dāng)前的視口(Viewport)

   //下面幾行為透視圖設(shè)置屏幕。意味著越遠(yuǎn)的東西看起來越小。這么做創(chuàng)建了一個現(xiàn)實
   //外觀的場景。此處透視按照基于窗口寬度和高度的45度視角來計算。0.1f,100.0f是
   //我們在場景中所能繪制深度的起點(diǎn)和終點(diǎn)。
   //glMatrixMode(GL_PROJECTION)指明接下來的兩行代碼將影響projection matrix(投影矩陣)。
   //投影矩陣負(fù)責(zé)為我們的場景增加透視。
   //glLoadIdentity()近似于重置。它將所選的矩陣狀態(tài)恢復(fù)成其原始狀態(tài)。
   //調(diào)用 glLoadIdentity()之后我們?yōu)閳鼍霸O(shè)置透視圖。

   glMatrixMode(GL_PROJECTION);         // 選擇投影矩陣
   glLoadIdentity();                    // 重置投影矩陣

   gluPerspective(45.0, Width / Height, 0.1, 100.0); // 計算窗口的外觀比例

   //glMatrixMode(GL_MODELVIEW)指明任何新的變換將會影響 modelview matrix(模型觀察矩陣)。
   //模型觀察矩陣中存放了我們的物體訊息。

   glMatrixMode(GL_MODELVIEW);          // 選擇模型觀察矩陣
   glLoadIdentity();                    // 重置模型觀察矩陣

   //如果現(xiàn)在還不能理解這些術(shù)語的含義,請別著急。
   //只要知道如果想獲得一個精彩的透視場景的話,必須這么做。
End;

//==============================================================================
// 對OpenGL進(jìn)行所有的設(shè)置。將設(shè)置清除屏幕所用的顏色,打開深度緩存,
// 啟用smooth shading(陰影平滑),等等。這個例程直到OpenGL窗口創(chuàng)建之后才會被調(diào)用。
// 此過程將有返回值。但此處的初始化沒那么復(fù)雜,現(xiàn)在還用不著擔(dān)心這個返回值。
//==============================================================================

Procedure glInit();
Begin

   //設(shè)置清除屏幕時所用的顏色。如果對色彩的工作原理不清楚的話,快速解釋一下。
   //色彩值的范圍從0.0f到1.0f。0.0f代表最黑的情況,1.0f就是最亮的情況。
   //glClearColor 后的第一個參數(shù)是Red Intensity(紅色分量),第二個是綠色,第三個是藍(lán)色。
   //最大值也是1.0f,代表特定顏色分量的最亮情況。最后一個參數(shù)是Alpha值。
   //當(dāng)它用來清除屏幕的時候,不用關(guān)心第四個數(shù)字?,F(xiàn)在讓它為0.0f。
   //通過混合三種原色(紅、綠、藍(lán)),可以得到不同的色彩
   //因此,使用glClearColor(0.0f,0.0f,1.0f,0.0f),您藍(lán)色來清除屏幕。
   //如果用 glClearColor(0.5f,0.0f,0.0f,0.0f)的話,將使用中紅色來清除屏幕。
   //不是最亮(1.0f),也不是最暗 (0.0f)。要得到白色背景,應(yīng)該將所有的顏色設(shè)成最亮(1.0f)。
   //要黑色背景的話,該將所有的顏色設(shè)為最暗(0.0f)。

   glClearColor(0.0, 0.0, 0.0, 0.0);    // 黑色背景

   //陰影平滑通過多邊形精細(xì)的混合色彩,并對外部光進(jìn)行平滑。

   glShadeModel(GL_SMOOTH);             // 啟用陰影平滑

   //接下來必須做的是關(guān)于depth buffer(深度緩存)的。將深度緩存設(shè)想為屏幕后面的層。
   //深度緩存不斷的對物體進(jìn)入屏幕內(nèi)部有多深進(jìn)行跟蹤。本程序其實沒有真正使用深度緩存,
   //但幾乎所有在屏幕上顯示3D場景OpenGL程序都使用深度緩存。它的排序決定那個物體先畫。
   //這樣您就不會將一個圓形后面的正方形畫到圓形上來。深度緩存是OpenGL十分重要的部分。

   glClearDepth(1.0);                   // 設(shè)置深度緩存
   glEnable(GL_DEPTH_TEST);             // 啟用深度測試
   glDepthFunc(GL_LESS);                // 所作深度測試的類型

   //接著告訴OpenGL我們希望進(jìn)行最好的透視修正。
   //這會十分輕微的影響性能。但使得透視圖看起來好一點(diǎn)。

   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 真正精細(xì)的透視修正

End;

//==============================================================================
//所有的繪圖代碼。任何您所想在屏幕上顯示的東東都將在此段代碼中出現(xiàn)。
//以后的每個程序會在此處增加新的代碼。
//==============================================================================

Procedure glDraw();
Begin
   glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度緩存
   glLoadIdentity();                    // 重置當(dāng)前的模型觀察矩陣
End;

Function WndProc(hWnd: HWND;            // 窗口的句柄
   Msg: UINT;                           // 窗口的消息
   wParam: WPARAM;                      // 附加的消息內(nèi)容
   lParam: LPARAM                       // 附加的消息內(nèi)容
   ): LRESULT; stdcall;
Begin
   Result := 0;
   Case (Msg) Of                        // 檢查Windows消息
      WM_ACTIVATE:                      // 監(jiān)視窗口激活消息
         Begin
         End;
      WM_CREATE:                        // 創(chuàng)建
         Begin
         End;
      WM_CLOSE:                         // 關(guān)閉
         Begin
            PostQuitMessage(0);         // 發(fā)出退出消息
            Result := 0
         End;
      WM_KEYDOWN:                       // 按鍵按下
         Begin
            keys[wParam] := True;       // 如果是,設(shè)為TRUE
            Result := 0;
         End;
      WM_KEYUP:                         // 按鍵松開
         Begin
            keys[wParam] := False;      // 如果是,設(shè)為FALSE
            Result := 0;
         End;
      WM_SIZE:                          //調(diào)整OpenGL窗口大小
         Begin
            glResizeWnd(LOWord(lParam), HIWORD(lParam));  //LoWord=Width,HiWord=Height
            Result := 0;
         End;
      WM_TIMER:                         //timers
         Begin
         End;
      Else                              //其余的讓W(xué)indows自行處理。
         Result := DefWindowProc(hWnd, Msg, wParam, lParam);  //向DefWindowProc傳遞所有未處理的消息。
   End;
End;
//==============================================================================
// 只在程序退出之前調(diào)用。作用是依次釋放著色描述表,設(shè)備描述表和窗口句柄。
// 加入了許多錯誤檢查。如果程序無法銷毀窗口的任意部分,都會彈出帶相應(yīng)錯誤消息的
// 訊息窗口,
//==============================================================================

Procedure glKillWnd(Fullscreen: Boolean);
Begin

   //在KillGLWindow()中所作的第一件事是檢查是否處于全屏模式。
   //如果是,要切換回桌面。本應(yīng)在禁用全屏模式前先銷毀窗口,
   //但在某些顯卡上這么做可能會使得桌面崩潰。所以還是先禁用全屏模式。
   //這將防止桌面出現(xiàn)崩潰,并在Nvidia和3dfx顯卡上都工作的很好!

   If Fullscreen Then                   // 處于全屏模式嗎?
      Begin
         //  使用ChangeDisplaySettings(NULL,0)回到原始桌面。
         //  將NULL作為第一個參數(shù),
         //  0作為第二個參數(shù)傳遞強(qiáng)制Windows使用當(dāng)前存放在注冊表中的值
         //  (缺省的分辨率、色彩深度、刷新頻率,等等)來有效的恢復(fù)我原始桌面。
         //  換回桌面后,還要使得鼠標(biāo)指針重新可見。

         ChangeDisplaySettings(devmode(Nil^), 0); // 是的話,切換回桌面
         ShowCursor(True);              //顯示鼠標(biāo)
      End;

   //是否擁有著色描述表(hRC)。
   If h_RC > 0 Then
      //看我們能否釋放它(將 hRC從hDC分開)。
      If (Not wglMakeCurrent(h_DC, 0)) Then
         MessageBox(0, 'DC和RC無法被釋放!', '錯誤', MB_OK Or
            MB_ICONERROR);

   // 能否刪除著色描述表
   If (Not wglDeleteContext(h_RC)) Then
      Begin
         MessageBox(0, '刪除著色描述表失敗!', '錯誤', MB_OK Or
            MB_ICONERROR);
         h_RC := 0;
      End;

   //是否存在設(shè)備描述表,如果有嘗試釋放它。
   If ((h_DC > 0) And (ReleaseDC(h_Wnd, h_DC) = 0)) Then
      Begin
         MessageBox(0, '釋放設(shè)備描述表失敗!', '錯誤', MB_OK Or
            MB_ICONERROR);
         h_DC := 0;
      End;

   //是否存在窗口句柄,調(diào)用 DestroyWindow( hWnd )來嘗試銷毀窗口
   If ((h_Wnd <> 0) And (Not DestroyWindow(h_Wnd))) Then
      Begin
         MessageBox(0, '無法銷毀窗體!', '錯誤', MB_OK Or
            MB_ICONERROR);
         h_Wnd := 0;
      End;

   // 注銷窗口類
   //這允許我們正常銷毀窗口,接著在打開其他窗口時,
   //不會收到諸如"Windows Class already registered"(窗口類已注冊)的錯誤消息。
   If (Not UnRegisterClass('OpenGL', hInstance)) Then
      Begin
         MessageBox(0, '無法注銷窗口類!', '錯誤', MB_OK Or
            MB_ICONERROR);
         hInstance := 0;
      End;
End;


上一篇:NeHe的opengl教程delphi版(3)----著色

下一篇:Delphi中預(yù)想不到的代碼

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

新聞熱點(diǎn)

疑難解答

圖片精選

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

欧美一激情一区二区三区| 国产亚洲欧美在线精品| 色拍拍在线精品视频8848| 国产日韩亚洲欧美在线| 国产风韵犹存在线视精品| 国产黄网在线观看| 欧美艳星介绍134位艳星| 亚洲欧洲性图库| 高清一区二区三区| 福利在线免费| 成人一区二区| 欧美成人免费视频| 妞干网免费在线视频| 污的视频网站| 久久精品国产av一区二区三区| 51调教丨国产调教视频| 欧美在线影院| 欧美日韩国产综合久久| av免费在线观看网址| 丰满人妻一区二区三区四区| 日本在线一区| 久久xxx视频| 中文久久精品| 中文字幕久久熟女蜜桃| av午夜一区麻豆| 国模大尺度私拍在线视频| brazzers在线观看| 美女撒尿一区二区三区| 国产伦精品一区二区三区免费视频| 亚洲精品在线视频观看| 久久久999国产| 91视频欧美| 日本国产精品视频| 国产一级在线播放| 91视频免费观看| 国产裸体永久免费无遮挡| 日韩欧美国产电影| 91网站在线播放| 7777精品伊人久久久大香线蕉经典版下载| 久久国产精品高清| 国产日韩欧美综合在线| 97超级碰碰碰| 精品国产大片大片大片| 欧美二区三区| 久久久久久国产精品美女| 日本在线视频www色| 97人洗澡人人免费公开视频碰碰碰| 欧美一区国产一区| av片免费观看| 久久99久久精品欧美| 日本一区二区三区www| 9191精品国产综合久久久久久| 国产日韩精品视频一区二区三区| 久久久久久久久久久免费视频| 欧美大片在线观看| 久久久久久久久久久免费| 日韩亚洲欧美中文字幕| 国产一区视频免费观看| 成人午夜在线视频| 中国女人内谢69xxxx免费视频| 国产精品一区二| 国产美女情趣调教h一区二区| 国产毛片久久久久| 日韩av影院在线观看| 偷拍一区二区| 岛国最新视频免费在线观看| 激情图片小说一区| 亚洲高清网站| 国产精品视频在线观看| 麻豆一区区三区四区产品精品蜜桃| 日本高清视频免费看| 伊人精品视频在线观看| 午夜影院免费观看视频| 天天色综合社区| 欧美日韩精品国产| 亚洲经典视频在线观看| 中文字幕第一页在线视频| 最近久乱中文字幕| 国产一区二区三区在线看麻豆| 欧美激情777| 亚洲中文字幕无码一区二区三区| ㊣最新国产の精品bt伙计久久| 五月天色一区| 99久久久免费精品国产一区二区| 在线免费观看黄色av| www.日韩大片| 91精品国产一区| 国产精品三级在线观看| 国产精品va在线观看无码| 97超碰中文字幕| 日本丰满少妇做爰爽爽| 91国偷自产一区二区使用方法| 国产精品1024久久| 日本电影亚洲天堂| 日韩在线一卡二卡| 在线一区二区视频| 久操网在线观看| 日韩av在线播放不卡| 欧美不卡1区2区3区| 波多野结衣一区二区三区四区| 2019中文字幕在线电影免费| 黄瓜视频污app| 亚洲欧美日韩精品久久久久| 国产一区二区丝袜| 国产精品久久久久久久7电影| 高清在线一区二区| 成人国产精品入口免费视频| 成人中文字幕合集| 久久久久久9999| 国产天堂av在线| 黄色的视频在线观看免费| 91tv官网精品成人亚洲| 日韩成人综合| 亚洲精品不卡| 中文人妻熟女乱又乱精品| 亚洲欧洲午夜一线一品| 在线观看污污网站| 国产成人av电影在线观看| 国内成人精品| 在线不卡日本v二区707| 麻豆精品视频入口| 成人观看免费视频| 秋霞影院一区二区| 涩涩网站在线看| 亚洲一区二区三区欧美| 国产成人精品三级麻豆| 国产剧情av片巨作醉酒女邻居| 丁香综合av| 亚洲欧美日本日韩| 懂色中文一区二区三区在线视频| 欧美日韩在线综合| 中文字幕一区二区三区乱码| 蜜桃av噜噜一区二区三区麻豆| 青青国产在线视频| 亚洲精品国产综合区久久久久久久| 国产51人人成人人人人爽色哟哟| 视色视频在线观看| 国产伦精品一区二区三区四区视频| 蜜桃自拍偷拍| 免费看日本毛片| 国产精品久在线观看| 国产+人+亚洲| 亚洲一区 中文字幕| 青青草手机视频在线观看| 亚洲伦理一区二区| 在线欧美福利| 中文字幕亚洲综合久久五月天色无吗''| 99热这里只有精品首页| youjizz.com亚洲| 免费观看黄网站| 怡红院av在线| 中文字幕有码热在线视频| 欧洲成人性视频| 4p变态网欧美系列| 色偷偷综合网| 91沈先生播放一区二区| 五月婷婷六月香| 777午夜精品电影免费看| 国产91久久久久蜜臀青青天草二| 天天射成人网| 黄色大片网站在线观看| 欧美亚一区二区| 在线不卡a资源高清| 蜜臀av性久久久久av蜜臀妖精| 欧美性猛交xxxx久久久| 无码人妻精品一区二区三| 韩国一区二区三区| 麻豆成人av| 亚洲国产国产亚洲一二三| 欧美在线www| 午夜免费福利视频在线观看| 啊v在线视频| 色一情一乱一乱一区91| 99精品国产视频| 成人av午夜影院| 中文字幕欧美精品日韩中文字幕| 男人天堂亚洲| 国产精品沙发午睡系列| 久久精品国产亚洲夜色av网站| 国产综合色在线视频区| 国产精品二区一区二区aⅴ污介绍| 久久久久成人精品免费播放动漫| 国产v综合v亚洲欧美久久| 色妇色综合久久夜夜| 台湾色综合娱乐中文网| 日韩在线视频在线观看| 亚洲国产精品第一区二区三区| 三级在线观看一区二区| 免费观看一级欧美片| 国语精品免费视频| 2020国产成人综合网| 青青草视频国产| 欧美黑人乱大交| 国产精品99爱免费视频| 不卡的看片网站| 狠狠色综合播放一区二区| 一区二区三区精品在线观看| 精品国产一区二区三区久久久蜜臀| 麻豆视频免费在线播放| 精品少妇一区二区三区在线播放| 91久久精品www人人做人人爽| 三级做a全过程在线观看| 神马久久久久久久久| 欧美体内谢she精2性欧美| 亚洲色图视频网| 成人在线视频免费| 男女猛烈无遮挡午夜视频| 日韩一区欧美| 婷婷综合成人| y111111国产精品久久久| 色悠悠久久综合| 五月天视频在线观看| 免费在线观看a| 国产无遮挡一区二区三区毛片日本| 欧美日韩有码| 亚洲欧美日韩综合一区| 国产强被迫伦姧在线观看无码| 欧美在线免费视频| 国产精品一区二区久久不卡| 九九视频在线观看| 一级做a爰片久久毛片美女图片| 日韩精品在线免费| 最新国产麻豆精品| 手机在线免费毛片| 久久99精品一区二区三区| 国产亚洲人成网站在线观看| 国产精品久久久免费看| 久久99性xxx老妇胖精品| 99九九99九九九99九他书对| 亚洲一区二区偷拍精品| 综合激情一区| 欧美成人一区二区视频| 中文字幕一区二区精品区| 五月天色婷婷丁香| 国内精品在线播放| 欧美激情777| 欧美国产欧美亚州国产日韩mv天天看完整| 欧美丰满少妇xxxx| 91在线地址| 久久久久亚洲| 国产三级视频在线| 黄色网一区二区| 国产午夜在线一区二区三区| 校园春色 亚洲色图| 久久久久久久久久久福利| 在线影院国内精品| 美腿丝袜亚洲一区| 亚洲精品国产精品国自产观看浪潮| 四虎精品成人免费网站| 精品免费视频.| 国产精品成久久久久| 欧美96在线丨欧| 国产精品久久在线| 国产高清视频免费最新在线| 91制片厂在线| 欧美zozo| 成人免费网站黄| 九九热线有精品视频99| 99r精品视频| 成人激情在线观看| 黄色一级片av| a天堂中文字幕| 日本视频一二三区中文字幕| 久久久国产精品一区| 久蕉依人在线视频| 在线日韩国产网站| 亚洲人成网站在线观看播放| 日本综合字幕| 极品尤物久久久av免费看| 国产一区二区三区奇米久涩| 亚洲国产不卡| av 日韩 人妻 黑人 综合 无码| 97超碰人人模人人爽人人看| 久久精品免视着国产成人| av在线电影网站| 亚洲国产裸拍裸体视频在线观看乱了| 手机在线观看av| mm视频在线视频| 亚洲免费av一区| 手机在线观看av网站| 国产福利精品一区二区三区| 最新亚洲国产精品| 黄色一级视频网站| 欧美久久久久久久久久久久久久| 国产精品久久精品国产| 成人精品电影在线观看| 深夜成人在线| 亚洲精品中文字幕乱码三区不卡| 一区二区三区四区不卡视频| 久久精品国产亚洲av香蕉| 亚洲永久精品大片| free性欧洲69| 欧美黑人xxx| 欧洲乱码伦视频免费| 精品卡一卡二卡三卡四在线| 国产精品77777竹菊影视小说| 久久精品99国产精品酒店日本| 91国产视频在线| 成人免费观看在线视频| 极品颜值美女露脸啪啪| 亚洲福利免费| 国产99午夜精品一区二区三区| 欧美高清视频在线观看| 6699嫩草久久久精品影院| 国产成人在线视频免费观看| 91最新网址| 日韩一区二区三区视频| 成人在线免费观看视频| 免费成人av电影| 国产精品suv一区二区69| www国产精品| 毛片免费视频| 欧美亚男人的天堂| 美日韩一区二区三区| 国产私人尤物无码不卡| 性刺激的欧美三级视频| 免费v片在线观看| 日韩一区在线播放| 夜夜揉揉日日人人青青一国产精品| 欧洲金发美女大战黑人| 夜夜躁日日躁狠狠久久av| 天天爽天天爽夜夜爽| 国产精品乱子伦| 欧美日韩亚洲国内综合网| 波多野结衣免费观看| 国产精品大全| 天堂а√在线8种子蜜桃视频| 亚洲精品aaaaa|