程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi 自制簡單的opengl游戲:三維旋轉星體

Delphi 自制簡單的opengl游戲:三維旋轉星體

編輯:Delphi

Delphi 自制的游戲素材:OpenGL三維旋轉星體代碼。在Delphi中,OpenGL可以作為自身動態運行時間庫(RTL)的一部分,以pas單元的形式放在“……\Borland\Delphi5\Source\Rtl\Win”目錄下,可以象使用其他單元文件一樣方便地使用。OpenGL的繪圖環境與GDI(Graphic Devic Interface,圖形設備接口)的繪圖環境不同。因此各自的使用方法也不一樣。本實例的Opengl繪圖步驟:
1.獲取顯示設備的句柄,這個句柄可以用GetDC開獲取。
2.設置象素格式(pixelFormat)。該步驟先用ChoosePixelFormat選取預先根據顯示設備設置好的象素格式,然後用SetPixelFormat來設置象素格式 。
3.建立新的OpenGL Rendering Context(HGLRC),這個參數相當於GDI中繪圖設備的HDC,兩者的調用方法也很相似。如本例中的hrc:=wglCreateContext(Canvas.Handle),在創建了這樣一個HRC之後,在設備上繪圖時只要將這個HRC通過wglMakeCurrent(Canvas.Handle, hrc)設置為當前的繪圖環境即可。
4.設置視口和透視投影坐標。Opengl是一個三維繪圖系統,所有繪制的圖形都是建立在三維空間內的,因此要設置透視投影坐標,以便能觀察繪制的圖形效果。
經過了上述四個步驟之後,就可以在指定的設備上畫圖了。本例中的畫圖操作在是由夾在glbegin()…glEnd中的函數體中的操作完成的。

本示例的代碼運行效果如下圖:

Delphi 自制 OpenGL三維旋轉星體

在本例中,並沒有使用Delphi自帶的Opengl.pas文件,而是引入了Mike Lischke針對具體應用情況重新編寫的OpenGL.pas單元。主要原因是該單元已經將初始化設置和渲染設置已經很好地封閉了,可以非常方便而簡潔地調用。還將常用的幾何實體變換封裝成Geometry.pas單元。有了這兩個單元文件,在設計OpenGL游戲時,可以將主要的精力放在游戲的思路和總體規劃中,而不是花在各種環境的設置和實體模型的創建和變換中。本例也不打算對這兩個單元進行說明了,只介紹如何調用它們實現本例的形體旋轉效果。特別要說明的是必須將新的OpenGL.pas和Geometry.pas和工程文件放在同一目錄中。
另外,本例創建的是控制台程序,而不是標准的win32程序。因此,一個重要的技術就是如何在控制台環境下實現窗口的創建和銷毀等效果。

001 program Project2; 002 {$APPTYPE CONSOLE} 003 uses Windows, Messages,OpenGL; 004 var 005   hParentWnd: hWnd;                 // 窗口句柄 006   h_DC: hDC;                        // 設備環境的句柄 007   h_RC: hGLRC;                     // 渲染環境的句柄 008   WndClass: TWndClass;              // 窗口類型 009   iMessage: TMsg;                  // 屏幕的長度和寬度 010   PWndWidth, PWndHeight: Integer; // 旋轉的星體 011   Angle: Integer; 012 // 處理父窗口消息的方法 013 function MainWndProc(hWnd:hWnd; iMessage: uInt; wParam: wParam; lParam: lParam): lResult; export; stdcall; 014 begin 015   Result := 0; 016   case iMessage of 017     WM_DESTROY: PostQuitMessage(0);  // 通知窗口程序即將退出 018   else 019     Result := DefWindowProc(hWnd, iMessage, wParam, lParam); 020   end; 021 end; 022 // 創建自定義的窗口 023 procedure PrepareWindow; 024 begin 025  if (hPrevInst = 0) then 026    begin 027      WndClass.style := CS_HREDRAW or CS_VREDRAW; 028      WndClass.lpfnWndProc := @MainWndProc;              // 指向處理窗口消息的過程 029      WndClass.cbClsExtra := 0; 030      WndClass.cbWndExtra := 0; 031      WndClass.hInstance := GetModuleHandle(nil); 032      WndClass.hIcon := 0; 033      WndClass.hCursor := LOADCURSOR(0, IDC_ARROW); 034      WndClass.hBrBackground := 0;                       //opengl場景不需要背景 035      WndClass.lpszMenuName := nil; 036      WndClass.lpszClassName := 'glClass'; 037      if RegisterClass(WndClass) = 0  then 038       begin 039         MessageBox(hParentWnd, '窗口類型不能被注冊!', nil, MB_OK or MB_ICONSTOP or MB_TASKMODAL); 040         Halt; 041       end; 042    end; 043   PWndWidth  := Round(GetSystemMetrics(SM_CXSCREEN)/2);  //設置演示窗口的寬度 044   PWndHeight := Round(GetSystemMetrics(SM_CYSCREEN)/2); // 設置嚴實窗口的長度 045   hParentWnd := CreateWindow('glClass', 'Delphi中演示OPENGL動畫', WS_SYSMENU, 0, 0, PWndWidth, PWndHeight, 0, 0, hInstance, nil); 046 end; 047 // 繪制場景 048 procedure DrawScene; 049 begin 050  Angle := Angle+Random(20); 051  glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);  // 清除幀緩沖區,為繪制新的幀做准備 052  glPushMatrix;                                         // 保存當前矩陣 053  glTranslatef(Random(2)/10, Random(2)/10,Random(2)-6); 054  {將視點後移使全部的場景可見,前面兩個數值分別是X,Y的坐標值,最後的數值決定對象大小} 055  // 轉動對象的視點,後面三個數字表示旋轉幅度,值越大幅度越大 056  glRotatef(Angle, 1, 1, 1); 057  // glRotatef(Angle,0,0,0);   //很強的視覺沖擊效果 058  //以下是定義組成星體的點元素 059   glBegin(GL_TRIANGLES); 060     glNormal3f(-0.74116, -0.579615, 0.338716); 061     glVertex3f(-0.475525, -0.142578, 0.154755); 062     glVertex3f(-0.293854, -0.451569, 0.0235291); 063     glVertex3f(-0.344055, -0.147278, 0.434387); 064   glEnd; 065   glBegin(GL_TRIANGLES); 066     glNormal3f(-0.410835, -0.910633, -0.0442978); 067     glVertex3f(-0.293854, -0.451569, 0.0235291); 068     glVertex3f(-0.0111389, -0.565186, -0.262848); 069     glVertex3f(0.168762, -0.656647, -0.0511475); 070   glEnd; 071   glBegin(GL_TRIANGLES); 072     glNormal3f(0.569974, -0.805453, 0.162401); 073     glVertex3f(0.168762, -0.656647, -0.0511475); 074     glVertex3f(0.417633, -0.475372, -0.0255432); 075     glVertex3f(0.253418, -0.528687, 0.286377); 076   glEnd; 077   glBegin(GL_TRIANGLES); 078     glNormal3f(0.949311, -0.3094, -0.0554997); 079     glVertex3f(0.417633, -0.475372, -0.0255432); 080     glVertex3f(0.471161, -0.290833, -0.138733); 081     glVertex3f(0.531952, -0.152008, 0.127167); 082   glEnd; 083   glBegin(GL_TRIANGLES); 084     glNormal3f(0.9759, 0.0404478, 0.214439); 085     glVertex3f(0.531952, -0.152008, 0.127167); 086     glVertex3f(0.533997, 0.20929, 0.0497131); 087     glVertex3f(0.472351, 0.0888977, 0.352966); 088   glEnd; 089   glBegin(GL_TRIANGLES); 090     glNormal3f(0.672389, 0.730092, -0.121896); 091     glVertex3f(0.533997, 0.20929, 0.0497131); 092     glVertex3f(0.425964, 0.25, -0.302368); 093     glVertex3f(0.306183, 0.404633, -0.0369263); 094   glEnd; 095   glBegin(GL_TRIANGLES); 096     glNormal3f(0.292631, 0.954815, -0.051914); 097     glVertex3f(0.306183, 0.404633, -0.0369263); 098     glVertex3f(0.0134583, 0.491821, -0.083374); 099     glVertex3f(0.131439, 0.474701, 0.266785); 100   glEnd; 101   glBegin(GL_TRIANGLES); 102     glNormal3f(-0.29624, 0.930867, -0.21384); 103     glVertex3f(0.0134583, 0.491821, -0.083374); 104     glVertex3f(-0.131439, 0.40448, -0.262848); 105     glVertex3f(-0.293854, 0.415649, 0.0107727); 106   glEnd; 107   glBegin(GL_TRIANGLES); 108     glNormal3f(-0.704095, 0.703107, 0.0994509); 109     glVertex3f(-0.475525, 0.224731, 0.0743408); 110     glVertex3f(-0.344055, 0.324249, 0.301544); 111     glVertex3f(-0.293854, 0.415649, 0.0107727); 112   glEnd; 113   glBegin(GL_TRIANGLES); 114     glNormal3f(-0.986932, -0.0344614, -0.157411); 115     glVertex3f(-0.425293, -0.0452881, -0.181488); 116     glVertex3f(-0.475525, -0.142578, 0.154755); 117     glVertex3f(-0.475525, 0.224731, 0.0743408); 118   glEnd; 119   glBegin(GL_TRIANGLES); 120     glNormal3f(-0.319147, -0.514182, -0.796091); 121     glVertex3f(-0.267548, -0.15448, -0.425323); 122     glVertex3f(0.191071, -0.337128, -0.491211); 123     glVertex3f(-0.0111389, -0.565186, -0.262848); 124   glEnd; 125   glBegin(GL_TRIANGLES); 126     glNormal3f(-0.156126, -0.100546, 0.982606); 127     glVertex3f(-0.317749, -0.0470581, 0.448822); 128     glVertex3f(-0.344055, -0.147278, 0.434387); 129     glVertex3f(-0.0487366, -0.464478, 0.448853); 130   glEnd; 131   glBegin(GL_TRIANGLES); 132     glNormal3f(0.77365, -0.250923, -0.58181); 133     glVertex3f(0.191071, -0.337128, -0.491211); 134     glVertex3f(0.312347, 0, -0.475342 ); 135     glVertex3f(0.471161, -0.290833, -0.138733); 136   glEnd; 137   glBegin(GL_TRIANGLES); 138     glNormal3f(0.376298, -0.37407, 0.847627); 139     glVertex3f(-0.0487366, -0.464478, 0.448853); 140     glVertex3f(0.253418, -0.528687, 0.286377); 141     glVertex3f(0.212646, -0.201538, 0.448853); 142   glEnd; 143   glBegin(GL_TRIANGLES); 144     glNormal3f(0.511356, 0.31956, -0.797744); 145     glVertex3f(0.312347, 0, -0.475342 ); 146     glVertex3f(0.131378, 0.249969, -0.491211); 147     glVertex3f(0.425964, 0.25, -0.302368); 148   glEnd; 149   glBegin(GL_TRIANGLES); 150     glNormal3f(0.407016, -0.0631076, 0.911238); 151     glVertex3f(0.212646, -0.201538, 0.448853); 152     glVertex3f(0.472351, 0.0888977, 0.352966); 153     glVertex3f(0.212646, 0.267761, 0.481354); 154   glEnd; 155   glBegin(GL_TRIANGLES); 156     glNormal3f(-0.270432, 0.623807, -0.733302); 157     glVertex3f(0.131378, 0.249969, -0.491211); 158     glVertex3f(-0.267548, 0.15448, -0.425323); 159     glVertex3f(-0.131439, 0.40448, -0.262848); 160   glEnd; 161   glBegin(GL_TRIANGLES); 162     glNormal3f(0.187651, 0.74153, 0.644143); 163     glVertex3f(0.212646, 0.267761, 0.481354); 164     glVertex3f(0.131439, 0.474701, 0.266785); 165     glVertex3f(-0.0811768, 0.360779, 0.459869); 166   glEnd; 167   glBegin(GL_TRIANGLES); 168     glNormal3f(-0.839618, 0, -0.543177 ); 169     glVertex3f(-0.425293, -0.0452881, -0.181488); 170     glVertex3f(-0.267548, 0.15448, -0.425323); 171     glVertex3f(-0.267548, -0.15448, -0.425323); 172   glEnd; 173   glBegin(GL_TRIANGLES); 174     glNormal3f(-0.523449, 0.281854, 0.804089); 175     glVertex3f(-0.344055, 0.324249, 0.301544); 176     glVertex3f(-0.317749, -0.0470581, 0.448822); 177     glVertex3f(-0.0811768, 0.360779, 0.459869); 178   glEnd; 179   glBegin(GL_TRIANGLES); 180     glNormal3f(-0.889618, -0.190557, 0.415053); 181     glVertex3f(-0.447205, 0.0761719, 0.315887); 182     glVertex3f(-0.475525, -0.142578, 0.154755); 183     glVertex3f(-0.344055, -0.147278, 0.434387); 184   glEnd; 185   glBegin(GL_TRIANGLES); 186     glNormal3f(-0.672801, -0.631467, 0.385471); 187     glVertex3f(0.00344849, -0.631836, 0.247131); 188     glVertex3f(-0.344055, -0.147278, 0.434387); 189     glVertex3f(-0.293854, -0.451569, 0.0235291); 190   glEnd; 191   glBegin(GL_TRIANGLES); 192     glNormal3f(-0.879473, -0.438944, -0.183999); 193     glVertex3f(-0.361786, -0.280945, -0.0588074); 194     glVertex3f(-0.293854, -0.451569, 0.0235291); 195     glVertex3f(-0.475525, -0.142578, 0.154755); 196   glEnd; 197   glBegin(GL_TRIANGLES); 198     glNormal3f(-0.703044, -0.516037, -0.489321); 199     glVertex3f(-0.361786, -0.280945, -0.0588074); 200     glVertex3f(-0.0111389, -0.565186, -0.262848); 201     glVertex3f(-0.293854, -0.451569, 0.0235291); 202   glEnd; 203   glBegin(GL_TRIANGLES); 204     glNormal3f(0.17191, -0.842719, -0.510169); 205     glVertex3f(0.282532, -0.491699, -0.285278); 206     glVertex3f(0.168762, -0.656647, -0.0511475); 207     glVertex3f(-0.0111389, -0.565186, -0.262848); 208   glEnd; 209   glBegin(GL_TRIANGLES); 210     glNormal3f(-0.42147, -0.892735, -0.159332); 211     glVertex3f(0.00344849, -0.631836, 0.247131); 212     glVertex3f(-0.293854, -0.451569, 0.0235291); 213     glVertex3f(0.168762, -0.656647, -0.0511475); 214   glEnd; 215   glBegin(GL_TRIANGLES); 216     glNormal3f(0.333159, -0.906305, 0.260032); 217     glVertex3f(0.00344849, -0.631836, 0.247131); 218     glVertex3f(0.168762, -0.656647, -0.0511475); 219     glVertex3f(0.253418, -0.528687, 0.286377); 220   glEnd; 221   glBegin(GL_TRIANGLES); 222     glNormal3f(0.764525, -0.567613, 0.305478); 223     glVertex3f(0.473358, -0.170807, 0.400909); 224     glVertex3f(0.253418, -0.528687, 0.286377); 225     glVertex3f(0.417633, -0.475372, -0.0255432); 226   glEnd; 227   glBegin(GL_TRIANGLES); 228     glNormal3f(0.586159, -0.768494, -0.256583); 229     glVertex3f(0.282532, -0.491699, -0.285278); 230     glVertex3f(0.417633, -0.475372, -0.0255432); 231     glVertex3f(0.168762, -0.656647, -0.0511475); 232   glEnd; 233   glBegin(GL_TRIANGLES); 234     glNormal3f(-0.705977, -0.593585, -0.386334); 235     glVertex3f(-0.361786, -0.280945, -0.0588074); 236     glVertex3f(-0.267548, -0.15448, -0.425323); 237     glVertex3f(-0.0111389, -0.565186, -0.262848); 238   glEnd; 239   glBegin(GL_TRIANGLES); 240     glNormal3f(0.141872, -0.760405, -0.633764); 241     glVertex3f(0.282532, -0.491699, -0.285278); 242     glVertex3f(-0.0111389, -0.565186, -0.262848); 243     glVertex3f(0.191071, -0.337128, -0.491211); 244   glEnd; 245   glBegin(GL_TRIANGLES); 246     glNormal3f(-0.27854, -0.381434, -0.881433); 247     glVertex3f(0.00231934, 0, -0.577454 ); 248     glVertex3f(0.191071, -0.337128, -0.491211); 249     glVertex3f(-0.267548, -0.15448, -0.425323); 250   glEnd; 251   glBegin(GL_TRIANGLES); 252     glNormal3f(-0.679685, 0.0732876, 0.729834); 253     glVertex3f(-0.447205, 0.0761719, 0.315887); 254     glVertex3f(-0.344055, -0.147278, 0.434387); 255     glVertex3f(-0.317749, -0.0470581, 0.448822); 256   glEnd; 257   glBegin(GL_TRIANGLES); 258     glNormal3f(-0.694999, -0.631368, 0.34402); 259     glVertex3f(0.00344849, -0.631836, 0.247131); 260     glVertex3f(-0.0487366, -0.464478, 0.448853); 261     glVertex3f(-0.344055, -0.147278, 0.434387); 262   glEnd; 263   glBegin(GL_TRIANGLES); 264     glNormal3f(-0.17093, -0.110087, 0.979114); 265     glVertex3f(-0.0549011, 0, 0.5 ); 266     glVertex3f(-0.317749, -0.0470581, 0.448822); 267     glVertex3f(-0.0487366, -0.464478, 0.448853); 268   glEnd; 269   glBegin(GL_TRIANGLES); 270     glNormal3f(0.796179, -0.46695, -0.384781); 271     glVertex3f(0.282532, -0.491699, -0.285278); 272     glVertex3f(0.471161, -0.290833, -0.138733); 273     glVertex3f(0.417633, -0.475372, -0.0255432); 274   glEnd; 275   glBegin(GL_TRIANGLES); 276     glNormal3f(0.968681, -0.225635, -0.103661); 277     glVertex3f(0.525299, -0.042511, -0.17334); 278     glVertex3f(0.531952, -0.152008, 0.127167); 279     glVertex3f(0.471161, -0.290833, -0.138733); 280   glEnd; 281   glBegin(GL_TRIANGLES); 282     glNormal3f(0.902522, -0.39741, 0.16589); 283     glVertex3f(0.473358, -0.170807, 0.400909); 284     glVertex3f(0.417633, -0.475372, -0.0255432); 285     glVertex3f(0.531952, -0.152008, 0.127167); 286   glEnd; 287   glBegin(GL_TRIANGLES); 288     glNormal3f(0.976342, 0.0429096, 0.21193); 289     glVertex3f(0.473358, -0.170807, 0.400909); 290     glVertex3f(0.531952, -0.152008, 0.127167); 291     glVertex3f(0.472351, 0.0888977, 0.352966); 292   glEnd; 293   glBegin(GL_TRIANGLES); 294     glNormal3f(0.877521, 0.357037, 0.320127); 295     glVertex3f(0.408844, 0.328003, 0.260376); 296     glVertex3f(0.472351, 0.0888977, 0.352966); 297     glVertex3f(0.533997, 0.20929, 0.0497131); 298   glEnd; 299   glBegin(GL_TRIANGLES); 300     glNormal3f(0.999592, -0.0112823, -0.0262407); 301     glVertex3f(0.525299, -0.042511, -0.17334); 302     glVertex3f(0.533997, 0.20929, 0.0497131); 303     glVertex3f(0.531952, -0.152008, 0.127167); 304   glEnd; 305   glBegin(GL_TRIANGLES); 306     glNormal3f(0.764909, -0.303992, -0.567894); 307     glVertex3f(0.282532, -0.491699, -0.285278); 308     glVertex3f(0.191071, -0.337128, -0.491211); 309     glVertex3f(0.471161, -0.290833, -0.138733); 310   glEnd; 311   glBegin(GL_TRIANGLES); 312     glNormal3f(0.774426, -0.249842, -0.581243); 313     glVertex3f(0.525299, -0.042511, -0.17334); 314     glVertex3f(0.471161, -0.290833, -0.138733); 315     glVertex3f(0.312347, 0, -0.475342 ); 316   glEnd; 317   glBegin(GL_TRIANGLES); 318     glNormal3f(0.312115, -0.0676723, -0.947631); 319     glVertex3f(0.00231934, 0, -0.577454 ); 320     glVertex3f(0.312347, 0, -0.475342 ); 321     glVertex3f(0.191071, -0.337128, -0.491211); 322   glEnd; 323   glBegin(GL_TRIANGLES); 324     glNormal3f(0.197739, -0.72867, 0.655698); 325     glVertex3f(0.00344849, -0.631836, 0.247131); 326     glVertex3f(0.253418, -0.528687, 0.286377); 327     glVertex3f(-0.0487366, -0.464478, 0.448853); 328   glEnd; 329   glBegin(GL_TRIANGLES); 330     glNormal3f(0.211591, -0.413455, 0.885598); 331     glVertex3f(0.473358, -0.170807, 0.400909); 332     glVertex3f(0.212646, -0.201538, 0.448853); 333     glVertex3f(0.253418, -0.528687, 0.286377); 334   glEnd; 335   glBegin(GL_TRIANGLES); 336     glNormal3f(0.108039, -0.107399, 0.988328); 337     glVertex3f(-0.0549011, 0, 0.5 ); 338     glVertex3f(-0.0487366, -0.464478, 0.448853); 339     glVertex3f(0.212646, -0.201538, 0.448853); 340   glEnd; 341   glBegin(GL_TRIANGLES); 342     glNormal3f(0.942466, 0.202839, -0.265731); 343     glVertex3f(0.525299, -0.042511, -0.17334); 344     glVertex3f(0.425964, 0.25, -0.302368); 345     glVertex3f(0.533997, 0.20929, 0.0497131); 346   glEnd; 347   glBegin(GL_TRIANGLES); 348     glNormal3f(0.540665, 0.809814, -0.227778); 349     glVertex3f(0.170563, 0.425323, -0.285278); 350     glVertex3f(0.306183, 0.404633, -0.0369263); 351     glVertex3f(0.425964, 0.25, -0.302368); 352   glEnd; 353   glBegin(GL_TRIANGLES); 354     glNormal3f(0.657824, 0.75244, -0.0332111); 355     glVertex3f(0.408844, 0.328003, 0.260376); 356     glVertex3f(0.533997, 0.20929, 0.0497131); 357     glVertex3f(0.306183, 0.404633, -0.0369263); 358   glEnd; 359   glBegin(GL_TRIANGLES); 360     glNormal3f(0.467657, 0.881464, 0.0657114); 361     glVertex3f(0.408844, 0.328003, 0.260376); 362     glVertex3f(0.306183, 0.404633, -0.0369263); 363     glVertex3f(0.131439, 0.474701, 0.266785); 364   glEnd; 365   glBegin(GL_TRIANGLES); 366     glNormal3f(0.036579, 0.998664, 0.036503); 367     glVertex3f(-0.138153, 0.486145, 0.223846); 368     glVertex3f(0.131439, 0.474701, 0.266785); 369     glVertex3f(0.0134583, 0.491821, -0.083374); 370   glEnd; 371   glBegin(GL_TRIANGLES); 372     glNormal3f(0.296505, 0.951448, -0.0826477); 373     glVertex3f(0.170563, 0.425323, -0.285278); 374     glVertex3f(0.0134583, 0.491821, -0.083374); 375     glVertex3f(0.306183, 0.404633, -0.0369263); 376   glEnd; 377   glBegin(GL_TRIANGLES); 378     glNormal3f(0.818651, 0.0249238, -0.57375); 379     glVertex3f(0.525299, -0.042511, -0.17334); 380     glVertex3f(0.312347, 0, -0.475342 ); 381     glVertex3f(0.425964, 0.25, -0.302368); 382   glEnd; 383   glBegin(GL_TRIANGLES); 384     glNormal3f(0.407482, 0.655568, -0.635759); 385     glVertex3f(0.170563, 0.425323, -0.285278); 386     glVertex3f(0.425964, 0.25, -0.302368); 387     glVertex3f(0.131378, 0.249969, -0.491211); 388   glEnd; 389   glBegin(GL_TRIANGLES); 390     glNormal3f(0.3086, 0.163933, -0.936959); 391     glVertex3f(0.00231934, 0, -0.577454 ); 392     glVertex3f(0.131378, 0.249969, -0.491211); 393     glVertex3f(0.312347, 0, -0.475342 ); 394   glEnd; 395   glBegin(GL_TRIANGLES); 396     glNormal3f(0.157363, 0.179867, 0.971022); 397     glVertex3f(0.473358, -0.170807, 0.400909); 398     glVertex3f(0.472351, 0.0888977, 0.352966); 399     glVertex3f(0.212646, -0.201538, 0.448853); 400   glEnd; 401   glBegin(GL_TRIANGLES); 402     glNormal3f(0.618173, 0.421188, 0.663674); 403     glVertex3f(0.408844, 0.328003, 0.260376); 404     glVertex3f(0.212646, 0.267761, 0.481354); 405     glVertex3f(0.472351, 0.0888977, 0.352966); 406   glEnd; 407   glBegin(GL_TRIANGLES); 408     glNormal3f(0.137357, -0.0684344, 0.988155); 409     glVertex3f(-0.0549011, 0, 0.5 ); 410     glVertex3f(0.212646, -0.201538, 0.448853); 411     glVertex3f(0.212646, 0.267761, 0.481354); 412   glEnd; 413   glBegin(GL_TRIANGLES); 414     glNormal3f(-0.898457, -0.367331, -0.240507); 415     glVertex3f(-0.361786, -0.280945, -0.0588074); 416     glVertex3f(-0.475525, -0.142578, 0.154755); 417     glVertex3f(-0.425293, -0.0452881, -0.181488); 418   glEnd; 419   glBegin(GL_TRIANGLES); 420     glNormal3f(-0.990518, 0.0293809, 0.134204); 421     glVertex3f(-0.447205, 0.0761719, 0.315887); 422     glVertex3f(-0.475525, 0.224731, 0.0743408); 423     glVertex3f(-0.475525, -0.142578, 0.154755); 424   glEnd; 425   glBegin(GL_TRIANGLES); 426     glNormal3f(-0.930333, 0.145751, -0.336506); 427     glVertex3f(-0.361786, 0.262848, -0.223602); 428     glVertex3f(-0.425293, -0.0452881, -0.181488); 429     glVertex3f(-0.475525, 0.224731, 0.0743408); 430   glEnd; 431   glBegin(GL_TRIANGLES); 432     glNormal3f(-0.0915225, 0.922481, -0.375037); 433     glVertex3f(0.170563, 0.425323, -0.285278); 434     glVertex3f(-0.131439, 0.40448, -0.262848); 435     glVertex3f(0.0134583, 0.491821, -0.083374); 436   glEnd; 437   glBegin(GL_TRIANGLES); 438     glNormal3f(-0.533345, 0.770975, -0.348053); 439     glVertex3f(-0.361786, 0.262848, -0.223602); 440     glVertex3f(-0.293854, 0.415649, 0.0107727); 441     glVertex3f(-0.131439, 0.40448, -0.262848); 442   glEnd; 443   glBegin(GL_TRIANGLES); 444     glNormal3f(-0.272513, 0.955032, -0.116838); 445     glVertex3f(-0.138153, 0.486145, 0.223846); 446     glVertex3f(0.0134583, 0.491821, -0.083374); 447     glVertex3f(-0.293854, 0.415649, 0.0107727); 448   glEnd; 449   glBegin(GL_TRIANGLES); 450     glNormal3f(-0.863373, 0.378291, 0.333889); 451     glVertex3f(-0.447205, 0.0761719, 0.315887); 452     glVertex3f(-0.344055, 0.324249, 0.301544); 453     glVertex3f(-0.475525, 0.224731, 0.0743408); 454   glEnd; 455   glBegin(GL_TRIANGLES); 456     glNormal3f(-0.574288, 0.804112, 0.153612); 457     glVertex3f(-0.138153, 0.486145, 0.223846); 458     glVertex3f(-0.293854, 0.415649, 0.0107727); 459     glVertex3f(-0.344055, 0.324249, 0.301544); 460   glEnd; 461   glBegin(GL_TRIANGLES); 462     glNormal3f(-0.742204, 0.639143, -0.201568); 463     glVertex3f(-0.361786, 0.262848, -0.223602); 464     glVertex3f(-0.475525, 0.224731, 0.0743408); 465     glVertex3f(-0.293854, 0.415649, 0.0107727); 466   glEnd; 467   glBegin(GL_TRIANGLES); 468     glNormal3f(-0.100014, 0.766867, -0.633966); 469     glVertex3f(0.170563, 0.425323, -0.285278); 470     glVertex3f(0.131378, 0.249969, -0.491211); 471     glVertex3f(-0.131439, 0.40448, -0.262848); 472   glEnd; 473   glBegin(GL_TRIANGLES); 474     glNormal3f(-0.496295, 0.646655, -0.579248); 475     glVertex3f(-0.361786, 0.262848, -0.223602); 476     glVertex3f(-0.131439, 0.40448, -0.262848); 477     glVertex3f(-0.267548, 0.15448, -0.425323); 478   glEnd; 479   glBegin(GL_TRIANGLES); 480     glNormal3f(-0.245954, 0.427173, -0.870075); 481     glVertex3f(0.00231934, 0, -0.577454 ); 482     glVertex3f(-0.267548, 0.15448, -0.425323); 483     glVertex3f(0.131378, 0.249969, -0.491211); 484   glEnd; 485   glBegin(GL_TRIANGLES); 486     glNormal3f(-0.838044, -0.412032, -0.357647); 487     glVertex3f(-0.361786, -0.280945, -0.0588074); 488     glVertex3f(-0.425293, -0.0452881, -0.181488); 489     glVertex3f(-0.267548, -0.15448, -0.425323); 490   glEnd; 491   glBegin(GL_TRIANGLES); 492     glNormal3f(-0.49107, 0, -0.87112 ); 493     glVertex3f(0.00231934, 0, -0.577454 ); 494     glVertex3f(-0.267548, -0.15448, -0.425323); 495     glVertex3f(-0.267548, 0.15448, -0.425323); 496   glEnd; 497   glBegin(GL_TRIANGLES); 498     glNormal3f(-0.874574, 0.115899, -0.470838); 499     glVertex3f(-0.361786, 0.262848, -0.223602); 500     glVertex3f(-0.267548, 0.15448, -0.425323); 501     glVertex3f(-0.425293, -0.0452881, -0.181488); 502   glEnd; 503   glBegin(GL_TRIANGLES); 504     glNormal3f(0.399242, 0.730775, 0.553691); 505     glVertex3f(0.408844, 0.328003, 0.260376); 506     glVertex3f(0.131439, 0.474701, 0.266785); 507     glVertex3f(0.212646, 0.267761, 0.481354); 508   glEnd; 509   glBegin(GL_TRIANGLES); 510     glNormal3f(-0.0385133, 0.878612, 0.475982); 511     glVertex3f(-0.138153, 0.486145, 0.223846); 512     glVertex3f(-0.0811768, 0.360779, 0.459869); 513     glVertex3f(0.131439, 0.474701, 0.266785); 514   glEnd; 515   glBegin(GL_TRIANGLES); 516     glNormal3f(-0.0385461, 0.107696, 0.993436); 517     glVertex3f(-0.0549011, 0, 0.5 ); 518     glVertex3f(0.212646, 0.267761, 0.481354); 519     glVertex3f(-0.0811768, 0.360779, 0.459869); 520   glEnd; 521   glBegin(GL_TRIANGLES); 522     glNormal3f(-0.549513, 0.274117, 0.789237); 523     glVertex3f(-0.447205, 0.0761719, 0.315887); 524     glVertex3f(-0.317749, -0.0470581, 0.448822); 525     glVertex3f(-0.344055, 0.324249, 0.301544); 526   glEnd; 527   glBegin(GL_TRIANGLES); 528     glNormal3f(-0.206353, 0.0933145, 0.974018); 529     glVertex3f(-0.0549011, 0, 0.5 ); 530     glVertex3f(-0.0811768, 0.360779, 0.459869); 531     glVertex3f(-0.317749, -0.0470581, 0.448822); 532   glEnd; 533   glBegin(GL_TRIANGLES); 534     glNormal3f(-0.408821, 0.761405, 0.503119); 535     glVertex3f(-0.138153, 0.486145, 0.223846); 536     glVertex3f(-0.344055, 0.324249, 0.301544); 537     glVertex3f(-0.0811768, 0.360779, 0.459869); 538   glEnd; 539  SwapBuffers(h_DC);        // 交換幀緩沖區 540  glPopMatrix;              // 處理當前矩陣 541 end;                       // 置於先前保存的矩陣之後 542 // 正式繪制Opengl場景 543 procedure PrepareScene; 544 begin 545   glEnable(GL_DEPTH_TEST); 546   glEnable(GL_CULL_FACE); 547   glEnable(GL_NORMALIZE); 548   glEnable(GL_LIGHTING); 549   glEnable(GL_LIGHT0); 550   glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); 551   glMatrixMode(GL_PROJECTION); 552   glVIEwPort(0, 0, PWndWidth, PWndHeight);   // 設置渲染的環境 553   gluPerspective(60, 400/300, 1, 100);       // 設置其余的場景范圍 554   glMatrixMode(GL_MODELVIEW); 555   angle := 0; 556 end; 557 begin 558   PrepareWindow; 559   h_DC := GetDC(hParentWnd);  // 從創建的窗口中獲得一個句柄 560   InitOpenGL; // 激活動態鏈接庫 561   h_RC :=CreateRenderingContext(h_DC, [opDoubleBuffered], 0, 0);  // 設置Opengl的渲染環境 562   ActivateRenderingContext(h_DC, h_RC); // 激活設備句柄 563   PrepareScene; 564   ShowWindow(hParentWnd, SW_SHOW); // 使窗口可見 565   566   // 下列消息使這個程序循環執行 567   repeat 568     PeekMessage(iMessage, 0, 0, 0, PM_REMOVE); // 解釋消息 569     TranslateMessage(iMessage); 570     DispatchMessage(iMessage); // 給主窗口過程分派消息 571     DrawScene; 572   573   until (iMessage.message = WM_QUIT); 574   // 退出演示後的相關處理 575   DeactivateRenderingContext; 576   DestroyRenderingContext(h_RC); 577   ReleaseDC(hParentWnd, h_DC); 578   UnRegisterClass('glClass', hInstance); 579   CloSEOpenGL; 580   DestroyWindow(hParentWnd); 581 end.

本例實現的只是一個角狀星體在窗口中飄忽不定地旋轉著,沒有別的事件發生。在下面的實例中,將實現一個更加復雜的OpenGL游戲,裡面包含有背景貼圖、幾何對象加載和聲音素材的加入等功能。
目前在編制OpenGL游戲中,除使用Delphi自帶的OpenGL.pas單元文件外,很多時候都是使用一些更加方便快捷的OpenGL單元文件,比如本例就使用了Mike Lischke寫的OpenGL.pas。.這對於簡化OpenGL游戲的開發,節約時間和精力都是非常重要的。當然,如果有足夠的實力,最好是自己編寫一個適合自己的OpenGL.pas,但是一般情況下是沒有這個必要的。因為,在游戲開發過程中,進度是一個很重要的衡量指標。而且網絡是一個非常重要的資源,可能別人已經有人寫好了你想要的文件了。其實,在網絡上不斷的搜索中也可以學到不少東西。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved