麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Delphi > 正文

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

2019-11-18 18:33:57
字體:
來源:轉載
供稿:網友
 

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

 

PRogram Project1;

Uses
   opengl,
   windows,
   Messages;

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

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

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

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

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

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

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

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

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

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

Procedure glInit();
Begin

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

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

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

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

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

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

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

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

End;

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

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

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

Procedure glKillWnd(Fullscreen: Boolean);
Begin

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

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

         ChangeDisplaySettings(devmode(Nil^), 0); // 是的話,切換回桌面
         ShowCursor(True);              //顯示鼠標
      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;

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

   //是否存在窗口句柄,調用 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中預想不到的代碼

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

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 日本中文视频 | 成人毛片100免费观看 | 一区播放| av在线1| 亚洲国产高清一区 | 国产羞羞视频 | 成人免费毛片一 | 色操网 | 国产精品成人亚洲一区二区 | 青青国产在线视频 | 韩国十九禁高潮床戏在线观看 | 欧美性生交大片 | 爱操视频 | 欧美日韩视频在线播放 | 露脸各种姿势啪啪的清纯美女 | 国产精品免费一区二区三区四区 | 毛片视频网址 | 久久亚洲美女视频 | 一级毛片真人免费播放视频 | 毛片视频大全 | 在线播放av片 | 国产精品视频专区 | www.狠狠插.com | 国产精品久久久久久久久久10秀 | 久久久久久免费 | 黄色大片在线免费看 | 性欧美大战久久久久久久免费观看 | av在线免费不卡 | 一级大片在线观看 | 国产精品视频在线观看免费 | 中文字幕在线视频网站 | 久久综合久久综合久久综合 | 91av久久| 日韩视频在线观看免费 | 国产午夜免费福利 | 欧美一级免费看 | 中国漂亮护士一级a毛片 | 视频一区二区三区在线观看 | 中文字幕亚洲一区二区三区 | 国产真实孩交 | 日韩av成人 |