1. 程式人生 > >OpenGL曲面紋理貼圖技術--波浪的模擬

OpenGL曲面紋理貼圖技術--波浪的模擬

{
 GLuint  PixelFormat;   
// 儲存查詢匹配的結果
 WNDCLASS wc;      // 視窗類結構
 DWORD  dwExStyle;    // 擴充套件視窗風格
 DWORD  dwStyle;    // 視窗風格
 RECT  WindowRect;    // 取得矩形的左上角和右下角的坐

標值
 WindowRect.left
=(long)0;   // 將Left   設為 0
 WindowRect.right=(long)width;  // 將Right  設為要求的寬度
 WindowRect.top=(long)0;    // 將Top    設為 0
 WindowRect.bottom=
(long)height;  // 將Bottom 設為要求的高度

 fullscreen
=fullscreenflag;   // 設定全域性全屏標誌

 hInstance   
= GetModuleHandle(NULL);    

// 取得我們視窗的例項
 wc.style   = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // 移動時重畫,

併為視窗取得DC
 wc.lpfnWndProc  
= (WNDPROC) WndProc;     //

WndProc處理訊息
 wc.cbClsExtra  
=0;         

// 無額外視窗資料
 wc.cbWndExtra  =0;         

// 無額外視窗資料
 wc.hInstance  = hInstance;       

// 設定例項
 wc.hIcon   = LoadIcon(NULL, IDI_WINLOGO);   // 裝入

預設圖示
 wc.hCursor   
= LoadCursor(NULL, IDC_ARROW);   // 裝入

滑鼠指標
 wc.hbrBackground 
= NULL;         

// GL不需要背景
 wc.lpszMenuName  = NULL;         

// 不需要選單
 wc.lpszClassName ="OpenG";        

// 設定類名字

 
if (!RegisterClass(&
wc))         

// 嘗試註冊視窗類
{
  MessageBox(NULL,
"註冊視窗失敗","錯誤",MB_OK|MB_ICONEXCLAMATION);
  
return FALSE;          

 
// 退出並返回FALSE
 }

 
 
if (fullscreen)           

 
// 要嘗試全屏模式嗎?
{
  DEVMODE dmScreenSettings;        

// 裝置模式
  memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // 確保記憶體清空為零
  dmScreenSettings.dmSize=sizeof(dmScreenSettings);  // Devmode 結構

的大小
  dmScreenSettings.dmPelsWidth 
= width;    // 所選

螢幕寬度
  dmScreenSettings.dmPelsHeight 
= height;    // 所選

螢幕高度
  dmScreenSettings.dmBitsPerPel 
= bits;     // 每象

素所選的色彩深度
  dmScreenSettings.dmFields
=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

  
// 嘗試設定顯示模式並返回結果。注: CDS_FULLSCREEN 移去了狀態條
if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!

=DISP_CHANGE_SUCCESSFUL)
  
{
   
// 若模式失敗,提供兩個選項:退出或在視窗內執行。
if (MessageBox(NULL,"全屏模式在當前顯示卡上設定失敗!使用視窗模

式?
","NeHe G",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
{
    
//如果使用者選擇視窗模式,變數fullscreen 的值變為FALSE,程式繼續運


    fullscreen
=FALSE;  // 選擇視窗模式

(Fullscreen
=FALSE)
   }

   
else
   
{
    
//如果使用者選擇退出,彈出訊息視窗告知使用者程式將結束。並返回FALSE

告訴程式視窗未能成功建立。程式退出。
    MessageBox(NULL,
"程式將被關閉","錯誤",MB_OK|MB_ICONSTOP);
    
return FALSE;        

 
// 退出並返回 FALSE
   }

  }

 }


 
if (fullscreen)           

 
// 仍處於全屏模式嗎?
{
  dwExStyle
=WS_EX_APPWINDOW;        

// 擴充套件窗體風格
  dwStyle=WS_POPUP;         

 
// 窗體風格
  ShowCursor(FALSE);         

 
// 隱藏滑鼠指標
 }

 
else
 
{
  dwExStyle
=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;   // 擴充套件窗體風格
  dwStyle=WS_OVERLAPPEDWINDOW;       

// 窗體風格
 }


 AdjustWindowRectEx(
&WindowRect, dwStyle, FALSE, dwExStyle);  // 調整視窗達到

真正要求的大小

 
// 建立視窗
if (!(hWnd=CreateWindowEx( dwExStyle,       

// 擴充套件窗體風格
"OpenG",    

   
// 類名字
        title,     

   
// 視窗標題
        dwStyle |    

   
// 必須的窗體風格屬性
        WS_CLIPSIBLINGS |   

  
// 必須的窗體風格屬性
        WS_CLIPCHILDREN,   

  
// 必須的窗體風格屬性
00,     

   
// 視窗位置
        WindowRect.right-

WindowRect.left, 
// 計算調整好的視窗寬度
        WindowRect.bottom-

WindowRect.top, 
// 計算調整好的視窗高度
        NULL,     

   
// 無父視窗
        NULL,     

   
// 無選單
        hInstance,    

   
// 例項
        NULL)))     

   
// 不向WM_CREATE傳遞任何東東
{
  KillGLWindow();        
// 重置

顯示區
  MessageBox(NULL,
"視窗建立錯誤","錯誤",MB_OK|MB_ICONEXCLAMATION);
  
return FALSE;        // 返回 

FALSE
 }


 
static PIXELFORMATDESCRIPTOR pfd=//pfd 告訴視窗我們所希望

的東東,即視窗使用的畫素格式
 
{
  
sizeof(PIXELFORMATDESCRIPTOR),    // 上述格式描述符的大小
1,           

// 版本號
  PFD_DRAW_TO_WINDOW |// 格式支援視窗
  PFD_SUPPORT_OPENGL |// 格式必須支援

OpenGL
  PFD_DOUBLEBUFFER,       
// 必須

支援雙緩衝
  PFD_TYPE_RGBA,        
// 申請 

RGBA 格式
  bits,          

// 選定色彩深度
000000,       // 忽略

的色彩位
  
0,           

// 無Alpha快取
0,