OpenGL曲面紋理貼圖技術--波浪的模擬
阿新 • • 發佈:2019-02-04
{
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,
// 必須的窗體風格屬性
0, 0,
// 視窗位置
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,
// 選定色彩深度
0, 0, 0, 0, 0, 0, // 忽略
的色彩位
0,
// 無Alpha快取
0,
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=
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(&
// 嘗試註冊視窗類
...{
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,
// 必須的窗體風格屬性
0, 0,
// 視窗位置
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,
// 選定色彩深度
0, 0, 0, 0, 0, 0, // 忽略
的色彩位
0,
// 無Alpha快取
0,