NeHe OpenGL教程 第七课:光照和键盘 代码
生活随笔
收集整理的這篇文章主要介紹了
NeHe OpenGL教程 第七课:光照和键盘 代码
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
#include <windows.h> // Windows的頭文件
#include <glew.h> // 包含最新的gl.h,glu.h庫
#include <glut.h> // 包含OpenGL實用庫
#include <stdio.h> // 標準輸入/輸出庫的頭文件
#include <glaux.h> // GLaux庫的頭文件HGLRC hRC = NULL; // 窗口著色描述表句柄
HDC hDC = NULL; // OpenGL渲染描述表句柄
HWND hWnd = NULL; // 保存我們的窗口句柄
HINSTANCE hInstance; // 保存程序的實例bool keys[256]; // 保存鍵盤按鍵的數(shù)組
bool active = TRUE; // 窗口的活動標志,缺省為TRUE
bool fullscreen = TRUE; // 全屏標志缺省,缺省設定成全屏模式LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // WndProc的定義GLfloat xrot; // X 旋轉
GLfloat yrot; // Y 旋轉
GLfloat xspeed = 0.0f; // X 旋轉速度
GLfloat yspeed = 0.0f; // Y 旋轉速度GLfloat z=-5.0f; // 深入屏幕的距離GLuint texture[3]; // 存儲一個紋理BOOL light; // 光源的開/關
BOOL lp; // L鍵按下了么?
BOOL fp; // F鍵按下了么?GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f }; // 環(huán)境光參數(shù)
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; // 漫射光參數(shù)
GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f }; // 光源位置GLuint filter; // 濾波類型GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
{ // 防止被零除 if (height==0) { height=1; // 將Height設為1 } // 重置當前的視口 glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION);// 選擇投影矩陣 glLoadIdentity();// 重置投影矩陣 // 設置視口的大小 gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW);// 選擇模型觀察矩陣 glLoadIdentity();// 重置模型觀察矩陣
} AUX_RGBImageRec *LoadBMP(char *Filename) // 載入位圖圖象
{FILE *File=NULL; // 文件句柄if (!Filename) // 確保文件名已提供{return NULL; // 如果沒提供,返回 NULL}File=fopen(Filename,"r"); // 嘗試打開文件if (File) // 文件存在么?{fclose(File); // 關閉句柄return auxDIBImageLoad(Filename); // 載入位圖并返回指針}return NULL; // 如果載入失敗,返回 NULL
}int LoadGLTextures() // 載入位圖(調(diào)用上面的代碼)并轉換成紋理
{int Status=FALSE; // 狀態(tài)指示器AUX_RGBImageRec *TextureImage[1]; // 創(chuàng)建紋理的存儲空間memset(TextureImage,0,sizeof(void *)*1); // 將指針設為 NULL// 載入位圖,檢查有無錯誤,如果位圖沒找到則退出if (TextureImage[0]=LoadBMP("bitmap1.bmp")){Status=TRUE; // 將 Status 設為 TRUE// 創(chuàng)建 Nearest 濾波貼圖glBindTexture(GL_TEXTURE_2D, texture[0]);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);// 創(chuàng)建線性濾波紋理glBindTexture(GL_TEXTURE_2D, texture[1]);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);// 創(chuàng)建 MipMapped 紋理glBindTexture(GL_TEXTURE_2D, texture[2]);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); }if (TextureImage[0]) // 紋理是否存在{if (TextureImage[0]->data) // 紋理圖像是否存在{free(TextureImage[0]->data); // 釋放紋理圖像占用的內(nèi)存}free(TextureImage[0]); // 釋放圖像結構}return Status; // 返回 Status
}int InitGL(GLvoid) // 此處開始對OpenGL進行所有設置
{if (!LoadGLTextures()) // 調(diào)用紋理載入子例程{return FALSE; // 如果未能載入,返回FALSE}glEnable(GL_TEXTURE_2D); // 啟用紋理映射glShadeModel(GL_SMOOTH); // 啟用陰影平滑glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // 黑色背景glClearDepth(1.0f); // 設置深度緩存glEnable(GL_DEPTH_TEST); // 啟用深度測試glDepthFunc(GL_LEQUAL); // 所作深度測試的類型glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 真正精細的透視修正glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // 設置環(huán)境光glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // 設置漫射光glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // 設置光源位置glEnable(GL_LIGHT1);return TRUE; // 初始化 OK
}int DrawGLScene(GLvoid) // 從這里開始進行所有的繪制
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度緩存glLoadIdentity(); // 重置當前的模型觀察矩陣glTranslatef(0.0f,0.0f,z); // 移入/移出屏幕 z 個單位glRotatef(xrot,1.0f,0.0f,0.0f); // 繞X軸旋轉glRotatef(yrot,0.0f,1.0f,0.0f); // 繞Y軸旋轉glBindTexture(GL_TEXTURE_2D, texture[filter]); // 選擇由filter決定的紋理glBegin(GL_QUADS); // 開始繪制四邊形// 前側面glNormal3f( 0.0f, 0.0f, 1.0f); // 法線指向觀察者glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // 后側面glNormal3f( 0.0f, 0.0f,-1.0f); // 法線背向觀察者glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 頂面glNormal3f( 0.0f, 1.0f, 0.0f); // 法線向上glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // 底面glNormal3f( 0.0f,-1.0f, 0.0f); // 法線朝下glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // 右側面glNormal3f( 1.0f, 0.0f, 0.0f); // 法線朝右glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // 左側面glNormal3f(-1.0f, 0.0f, 0.0f); // 法線朝左glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glEnd(); // 四邊形繪制結束xrot+=xspeed; // xrot 增加 xspeed 單位yrot+=yspeed; // yrot 增加 yspeed 單位return TRUE;
}GLvoid KillGLWindow(GLvoid) { // 正常銷毀窗口if (fullscreen) { // 我們處于全屏模式嗎?ChangeDisplaySettings(NULL, 0);// 是的話,切換回桌面ShowCursor(TRUE); // 顯示鼠標指針}if (hRC) { // 我們擁有OpenGL渲染描述表嗎?if (!wglMakeCurrent(NULL, NULL)) { // 我們能否釋放DC和RC描述表?MessageBox(NULL, "釋放DC或RC失敗", "關閉錯誤", MB_OK | MB_ICONINFORMATION);}if (!wglDeleteContext(hRC)) {MessageBox(NULL, "釋放RC失敗。", "關閉錯誤", MB_OK | MB_ICONINFORMATION);}hRC = NULL;}if (hDC && !ReleaseDC(hWnd, hDC)) // 我們能否釋放 DC?{MessageBox(NULL, "釋放DC失敗。", "關閉錯誤", MB_OK | MB_ICONINFORMATION);hDC = NULL; // 將 DC 設為 NULL}if (hWnd && !DestroyWindow(hWnd)) // 能否銷毀窗口?{MessageBox(NULL, "釋放窗口句柄失敗。", "關閉錯誤", MB_OK |MB_ICONINFORMATION);hWnd = NULL; // 將 hWnd 設為 NULL}if (!UnregisterClass("OpenG", hInstance)) // 能否注銷類?{MessageBox(NULL, "不能注銷窗口類。", "關閉錯誤", MB_OK | MB_ICONINFORMATION);hInstance = NULL; // 將 hInstance 設為 NULL}
}// 創(chuàng)建OpenGL窗口
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag) {GLuint PixelFormat; // 保存查找匹配的結果WNDCLASS wc; // 窗口類結構DWORD dwExStyle;// 擴展窗口風格DWORD dwStyle; // 窗口風格RECT WindowRect; // 取得矩形的左上角和右下角的坐標值WindowRect.left = (long)0; // 將Left 設為 0WindowRect.right = (long)width; // 將Right 設為要求的寬度WindowRect.top = (long)0; // 將Top 設為 0WindowRect.bottom = (long)height; // 將Bottom 設為要求的高度fullscreen = fullscreenflag;hInstance = GetModuleHandle(NULL); //取得窗口實例wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; //移動時重畫并取得窗口DCwc.lpfnWndProc = (WNDPROC)WndProc; // WndProc處理消息wc.cbClsExtra = 0; // 無額外窗口數(shù)據(jù)wc.cbWndExtra = 0; // 無額外窗口數(shù)據(jù)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)); // 確保內(nèi)存清空為零dmScreenSettings.dmSize = sizeof(dmScreenSettings); // Devmode 結構的大小dmScreenSettings.dmPelsWidth = width; // 所選屏幕寬度dmScreenSettings.dmPelsHeight = height; // 所選屏幕高度dmScreenSettings.dmBitsPerPel = bits; // 每象素所選的色彩深度dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;// 嘗試設置顯示模式并返回結果。注: CDS_FULLSCREEN 移去了狀態(tài)條。if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN)!= DISP_CHANGE_SUCCESSFUL){// 若模式失敗,提供兩個選項:退出或在窗口內(nèi)運行。if (MessageBox(NULL, "全屏模式在當前顯卡上設置失敗!\n使用窗口模式?", "NeHe G",MB_YESNO | MB_ICONEXCLAMATION) == IDYES){fullscreen = FALSE; // 選擇窗口模式(Fullscreen=FALSE)}else{// 彈出一個對話框,告訴用戶程序結束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); // 調(diào)整窗口達到真正要求大小if (!(hWnd = CreateWindowEx(dwExStyle, // 擴展窗體風格"OpenG", // 類名字(LPTSTR)title, // 窗口標題WS_CLIPSIBLINGS | // 必須的窗體風格屬性WS_CLIPCHILDREN | // 必須的窗體風格屬性dwStyle, // 選擇的窗體屬性0, 0, // 窗口位置WindowRect.right - WindowRect.left, // 計算調(diào)整好的窗口寬度WindowRect.bottom - WindowRect.top, // 計算調(diào)整好的窗口高度NULL, // 無父窗口NULL, // 無菜單hInstance, // 實例NULL))) // 不向WM_CREATE傳遞任何東東{KillGLWindow(); // 重置顯示區(qū)MessageBox(NULL, "不能創(chuàng)建一個窗口設備描述表", "錯誤", MB_OK |MB_ICONEXCLAMATION);return FALSE; // 返回 FALSE}static PIXELFORMATDESCRIPTOR pfd = // /pfd 告訴窗口我們所希望的東 東,即窗口使用的像素格式{sizeof(PIXELFORMATDESCRIPTOR), // 上述格式描述符的大小1, // 版本號PFD_DRAW_TO_WINDOW | // 格式支持窗口PFD_SUPPORT_OPENGL | // 格式必須支持OpenGLPFD_DOUBLEBUFFER, // 必須支持雙緩沖PFD_TYPE_RGBA, // 申請 RGBA 格式bits, // 選定色彩深度0, 0, 0, 0, 0, 0, // 忽略的色彩位0, // 無Alpha緩存0, // 忽略Shift Bit0, // 無累加緩存0, 0, 0, 0, // 忽略聚集位16, // 16位 Z-緩存 (深度緩存)0, // 無蒙板緩存0, // 無輔助緩存PFD_MAIN_PLANE, // 主繪圖層0, // Reserved0, 0, 0 // 忽略層遮罩};if (!(hDC = GetDC(hWnd))) // 取得設備描述表了么?{KillGLWindow(); // 重置顯示區(qū)MessageBox(NULL, "不能創(chuàng)建一種相匹配的像素格式", "錯誤", MB_OK |MB_ICONEXCLAMATION);return FALSE; // 返回 FALSE}if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd))) // Windows 找到相應的象素格式了{KillGLWindow(); // 重置顯示區(qū)MessageBox(NULL, "不能設置像素格式", "錯誤", MB_OK | MB_ICONEXCLAMATION);return FALSE; // 返回 FALSE}if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd))) // Windows 找到相應的象素格式了嗎 ?{KillGLWindow(); // 重置顯示區(qū)MessageBox(NULL, "不能設置像素格式", "錯誤", MB_OK | MB_ICONEXCLAMATION);return FALSE; // 返回 FALSE}if (!SetPixelFormat(hDC, PixelFormat, &pfd)) // 能夠設置象素格式么?{KillGLWindow(); // 重置顯示區(qū)MessageBox(NULL, "不能設置像素格式", "錯誤", MB_OK | MB_ICONEXCLAMATION);return FALSE; // 返回 FALSE}if (!(hRC = wglCreateContext(hDC))) // 能否取得著色描述表?{KillGLWindow(); // 重置顯示區(qū)MessageBox(NULL, "不能創(chuàng)建OpenGL渲染描述表", "錯誤", MB_OK |MB_ICONEXCLAMATION);return FALSE; // 返回 FALSE}if (!wglMakeCurrent(hDC, hRC)) // 嘗試激活著色描述表{KillGLWindow(); // 重置顯示區(qū)MessageBox(NULL, "不能激活當前的OpenGL渲然描述表", "錯誤", MB_OK |MB_ICONEXCLAMATION);return FALSE; // 返回 FALSE}ShowWindow(hWnd, SW_SHOW); // 顯示窗口SetForegroundWindow(hWnd); // 略略提高優(yōu)先級SetFocus(hWnd); // 設置鍵盤的焦點至此窗口ReSizeGLScene(width, height); // 設置透視 GL 屏幕if (!InitGL()) // 初始化新建的GL窗口{KillGLWindow(); // 重置顯示區(qū)MessageBox(NULL, "Initialization Failed.", "ERROR", MB_OK | MB_ICONEXCLAMATION);return FALSE; // 返回 FALSE}return TRUE; // 成功
}LRESULT CALLBACK WndProc(HWND hWnd, // 窗口的句柄UINT uMsg, // 窗口的消息WPARAM wParam, // 附加的消息內(nèi)容LPARAM lParam) // 附加的消息內(nèi)容
{switch (uMsg) // 檢查Windows消息{case WM_ACTIVATE: // 監(jiān)視窗口激活消息{if (!HIWORD(wParam)) // 檢查最小化狀態(tài){active = TRUE; // 程序處于激活狀態(tài)}else{active = FALSE; // 程序不再激活}return 0; // 返回消息循環(huán)}case WM_SYSCOMMAND: // 系統(tǒng)中斷命令{switch (wParam) // 檢查系統(tǒng)調(diào)用{case SC_SCREENSAVE: // 屏保要運行?case SC_MONITORPOWER: // 顯示器要進入節(jié)電模式?return 0; // 阻止發(fā)生}break; // 退出}case WM_CLOSE: // 收到Close消息?{PostQuitMessage(0); // 發(fā)出退出消息return 0; // 返回}case WM_KEYDOWN: // 有鍵按下么?{keys[wParam] = TRUE; // 如果是,設為TRUEreturn 0; // 返回}case WM_KEYUP: // 有鍵放開么?{keys[wParam] = FALSE; // 如果是,設為FALSEreturn 0; // 返回}case WM_SIZE: // 調(diào)整OpenGL窗口大小{ReSizeGLScene(LOWORD(lParam), HIWORD(lParam)); // LoWord=Width,HiWord = Heightreturn 0; // 返回}}// 向 DefWindowProc傳遞所有未處理的消息。return DefWindowProc(hWnd, uMsg, wParam, lParam);
}int WINAPI WinMain(HINSTANCE hInstance, // 當前窗口實例HINSTANCE hPrevInstance, // 前一個窗口實例LPSTR lpCmdLine, // 命令行參數(shù)int nCmdShow) // 窗口顯示狀態(tài)
{MSG msg; // Windowsx消息結構BOOL done = FALSE; // 用來退出循環(huán)的Bool 變量// 提示用戶選擇運行模式if (MessageBox(NULL, "你想在全屏模式下運行么?", "設置全屏模式", MB_YESNO |MB_ICONQUESTION) == IDNO){fullscreen = FALSE; // FALSE為窗口模式}// 創(chuàng)建OpenGL窗口if (!CreateGLWindow("NeHe's OpenGL程序框架", 640, 480, 16, fullscreen)){return 0; // 失敗退出}while (!done) // 保持循環(huán)直到 done=TRUE{if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) // 有消息在等待嗎?{if (msg.message == WM_QUIT) // 收到退出消息?{done = TRUE; // 是,則done=TRUE}else // 不是,處理窗口消息{TranslateMessage(&msg); // 翻譯消息DispatchMessage(&msg); // 發(fā)送消息}}else // 如果沒有消息{// 繪制場景。監(jiān)視ESC鍵和來自DrawGLScene()的退出消息if (active) // 程序激活的么?{if (keys[VK_ESCAPE]) // ESC 按下了么?{done = TRUE; // ESC 發(fā)出退出信號}else // 不是退出的時候,刷新屏幕{DrawGLScene(); // 繪制場景SwapBuffers(hDC); // 交換緩存if (keys['L'] && !lp) // L 鍵已按下并且松開了?{lp=TRUE; // lp 設為 TRUElight=!light; // 切換光源的 TRUE/FALSEif (!light) // 如果沒有光源{glDisable(GL_LIGHTING); // 禁用光源}else // 否則{glEnable(GL_LIGHTING); // 啟用光源}}if (!keys['L']) // L鍵松開了么?{lp=FALSE; // 若是,則將lp設為FALSE}if (keys['F'] && !fp) // F鍵按下了么?{fp=TRUE; // fp 設為 TRUEfilter+=1; // filter的值加一if (filter>2) // 大于2了么?{filter=0; // 若是重置為0}printf("%d\n",filter);}if (!keys['F']) // F鍵放開了么?{fp=FALSE; // 若是fp設為FALSE}if (keys[VK_PRIOR]) // PageUp按下了?{z-=0.02f; // 若按下,將木箱移向屏幕內(nèi)部}if (keys[VK_NEXT]) // PageDown按下了么{z+=0.02f; // 若按下的話,將木箱移向觀察者}if (keys[VK_UP]) // Up方向鍵按下了么?{xspeed-=0.001f; // 若是,減少xspeed}if (keys[VK_DOWN]) // Down方向鍵按下了么?{xspeed+=0.001f; // 若是,增加xspeed}if (keys[VK_RIGHT]) // Right方向鍵按下了么?{yspeed+=0.001f; // 若是,增加yspeed}if (keys[VK_LEFT]) // Left方向鍵按下了么?{yspeed-=0.001f; // 若是, 減少yspeed}}}if (keys[VK_F1]) // F1鍵按下了么?{keys[VK_F1] = FALSE; // 若是,使對應的Key數(shù)組中的值為 FALSEKillGLWindow(); // 銷毀當前的窗口fullscreen = !fullscreen; // 切換 全屏 / 窗口 模式// 重建 OpenGL 窗if (!CreateGLWindow("NeHe's OpenGL 程序框架", 640, 480, 16, fullscreen)){return 0; // 如果窗口未能創(chuàng)建,程序退出}}}}// 關閉程序KillGLWindow(); // 銷毀窗口return (msg.wParam); // 退出程序
}
總結
以上是生活随笔為你收集整理的NeHe OpenGL教程 第七课:光照和键盘 代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第17天 命令行窗口
- 下一篇: 深圳水上乐园有哪些 而且便宜还好玩