Lesson 5 Nehe
来源:互联网 发布:布雷德索数据 编辑:程序博客网 时间:2024/04/30 17:21
#include <gl/opengl.h>HGLRC hRC = NULL;HDC hDC = NULL;HWND hWnd = NULL;HINSTANCE hInstance = NULL;BOOL keys[256];BOOL active = TRUE;BOOL fullscreen = FALSE;GLfloat rtri = 0.0f;GLfloat rquad = 360.0f;LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);GLvoid ReSizeGLScene(GLsizei width, GLsizei height){ // 如果高为0 , 则设置其为1 if (height == 0) height = 1; // 设置可以看到的视角 glViewport(0,0,width, height); // 设置投影矩阵 glMatrixMode(GL_PROJECTION); glLoadIdentity(); // 设置平截头体 gluPerspective(45.0f, (GLdouble)width/(GLdouble)height, 0.1f, 100.0f); // 设置模型矩阵 glMatrixMode(GL_MODELVIEW); glLoadIdentity();}GLvoid InitGL(){ glShadeModel(GL_SMOOTH); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 1.0f 为最大深度 glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);}BOOL DrawGLScene(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(-1.5f, 0.0f, -6.0f); glRotatef(rtri, 1.0f, 0.0f, 0.0f); glBegin(GL_TRIANGLES); //面1 glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); //面2 glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); glColor3f(1.0f, 1.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f); // 面3 glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); glColor3f(1.0f, 1.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f); glColor3f(1.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 面4 glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); glColor3f(1.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,-1.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glEnd(); // 面5, 加个底面 glBegin(GL_QUADS); glColor3f(0.0f, 1.0f, 0.0f); // 绿 glVertex3f(-1.0f, -1.0f, 1.0f); glColor3f(0.0, 0.0f, 1.0f); // 蓝 glVertex3f(1.0f, -1.0f, 1.0f); glColor3f(1.0f, 1.0f, 1.0f); // 白 glVertex3f(1.0f, -1.0f, -1.0f); glColor3f(1.0f, 1.0f, 0.0f); // 黄 glVertex3f(-1.0f, -1.0f, -1.0f); glEnd(); glLoadIdentity(); // 重置坐标系 glTranslatef(1.5f, 0.0f, -6.0f); glRotatef(rquad, 1.0f, 0.0f, 0.0f); // 画正方体 glBegin(GL_QUADS); // 面1 glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(-1.0f,-1.0f, 1.0f); glVertex3f( 1.0f,-1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // 面2 glColor3f(1.0f, 1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(1.0f,-1.0f, 1.0f); glVertex3f(1.0f,-1.0f,-1.0f); glVertex3f(1.0f, 1.0f,-1.0f); //面3 glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(-1.0f, 1.0f,-1.0f); glVertex3f(-1.0f,-1.0f,-1.0f); glVertex3f( 1.0f,-1.0f,-1.0f); glVertex3f( 1.0f, 1.0f,-1.0f); //面4 glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(-1.0f,-1.0f, 1.0f); glVertex3f(-1.0f,-1.0f,-1.0f); glVertex3f(-1.0f, 1.0f,-1.0f); //面5 glColor3f(1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, 1.0f,-1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glVertex3f( 1.0f, 1.0f,-1.0f); //面6 glColor3f(0.6f, 0.34f, 0.69f); glVertex3f(-1.0f,-1.0f,-1.0f); glVertex3f(-1.0f,-1.0f, 1.0f); glVertex3f( 1.0f,-1.0f, 1.0f); glVertex3f( 1.0f,-1.0f,-1.0f); glEnd(); if (rtri>= 360.0f) rtri = 0.0f; rtri += 0.2f; if (rquad <= 0.0f) rquad = 360.0f; rquad -= 0.15f; return TRUE;}GLvoid KillGLWindow(){ if (fullscreen){ ChangeDisplaySettings(NULL, 0); ShowCursor(FALSE); } if (hRC){ if (!wglMakeCurrent(NULL, NULL)) MessageBox(NULL, "释放DC 或 RC 失败", "错误", MB_OK); if (!wglDeleteContext(hRC)) MessageBox(NULL, "释放RC失败", "错误", MB_OK); hRC = NULL; } // ReleaseDC 失败返回0, 成功返回非0 if (hDC && !ReleaseDC(hWnd, hDC)){ MessageBox(NULL, "释放DC失败", "错误", MB_OK); hDC = NULL; } if (hWnd && !DestroyWindow(hWnd)){ MessageBox(NULL, "销毁窗口失败", "错误", MB_OK); hWnd = NULL; } if (!UnregisterClass("opengl", hInstance)){ MessageBox(NULL, "反注册失败", "错误", MB_OK); hInstance = NULL; }}BOOL CreateGLWindow(char* title, int width, int height, int bits, HINSTANCE hInstance, bool fullscreenflag){ GLuint PixelFormat; WNDCLASS wc; DWORD dwStyle; DWORD dwExStyle; RECT WindowRect; WindowRect.left = (long)0; WindowRect.right= (long)width; WindowRect.top = (long)0; WindowRect.bottom = (long)height; fullscreen = fullscreenflag; wc.hInstance = hInstance; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wc.lpfnWndProc = WindowProc; wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = NULL; wc.lpszClassName = "opengl"; wc.lpszMenuName = NULL; // 注册窗口类 if (!RegisterClass(&wc)){ MessageBox(NULL, "窗口注册失败", "错误", MB_OK); return FALSE; } if (fullscreen){ DEVMODE dmScreenSetting; memset(&dmScreenSetting, 0, sizeof(dmScreenSetting)); dmScreenSetting.dmSize = sizeof(dmScreenSetting); dmScreenSetting.dmBitsPerPel = bits; dmScreenSetting.dmPelsHeight = height; dmScreenSetting.dmPelsWidth = width; dmScreenSetting.dmFields = DM_BITSPERPEL | DM_PELSHEIGHT | DM_PELSWIDTH; // 设置显示模式 if (ChangeDisplaySettings(&dmScreenSetting, CDS_FULLSCREEN)!= DISP_CHANGE_SUCCESSFUL){ if (MessageBox(NULL, "当前显卡不支持全屏操做\n使用窗口模式?", "错误", MB_YESNO|MB_ICONEXCLAMATION) == IDYES){ fullscreen = FALSE; } else{ MessageBox(NULL, "程序将会被关闭", "错误", MB_OK|MB_ICONEXCLAMATION); return FALSE; } } } if (fullscreen){ dwExStyle = WS_EX_APPWINDOW; dwStyle = WS_POPUP; ShowCursor(FALSE); } else{ dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; dwStyle = WS_OVERLAPPEDWINDOW; //ShowCursor(TRUE); } dwStyle = dwStyle | WS_CLIPCHILDREN|WS_CLIPSIBLINGS; AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); if (!(hWnd = CreateWindowEx(dwExStyle, "opengl", title, dwStyle, 0,0, WindowRect.right-WindowRect.left, WindowRect.bottom-WindowRect.top, NULL, NULL, hInstance, NULL))){ KillGLWindow(); MessageBox(NULL, "不能创建一个窗口设备描述表", "错误", MB_OK); return FALSE; } static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW| PFD_SUPPORT_OPENGL| PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, bits, 0, 0, 0, 0, 0, 0, // 忽略的色彩位 0, // 无Alpha缓存 0, // 忽略Shift Bit 0, // 无累加缓存 0, 0, 0, 0, // 忽略聚集位 16, // 16位 Z-缓存 (深度缓存) 0, // 无蒙板缓存 0, // 无辅助缓存 PFD_MAIN_PLANE, // 主绘图层 0, // Reserved 0, 0, 0 // 忽略层遮罩 }; if (!(hDC = GetDC(hWnd))){ KillGLWindow(); MessageBox(NULL, "不能创建一个相匹配的像素模式", "错误", MB_OK|MB_ICONEXCLAMATION); return FALSE; } if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd))){ KillGLWindow(); MessageBox(NULL, "不能设置像素格式", "错误", MB_OK|MB_ICONEXCLAMATION); return FALSE; } if (!SetPixelFormat(hDC, PixelFormat, &pfd)){ KillGLWindow(); MessageBox(NULL, "不能设置像素格式", "错误",MB_OK|MB_ICONEXCLAMATION); return FALSE; } if (!(hRC = wglCreateContext(hDC))){ KillGLWindow(); MessageBox(NULL, "不能创建当前的opengl渲染描述表", "错误", MB_OK|MB_ICONEXCLAMATION); return FALSE; } if (!wglMakeCurrent(hDC, hRC)){ KillGLWindow(); MessageBox(NULL, "不能激活当前的opengl渲染描述表", "错误", MB_OK); return FALSE; } ShowWindow(hWnd, SW_SHOW); // 激活窗口 SetForegroundWindow(hWnd); // 接收键盘信息 SetFocus(hWnd); ReSizeGLScene(width, height); InitGL(); return TRUE;}LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ){ switch(uMsg){ case WM_ACTIVATE: { if (!HIWORD(wParam)) active = TRUE; else active = FALSE; return 0; } case WM_CLOSE: { PostQuitMessage(0); return 0; } case WM_KEYUP: { keys[wParam] = FALSE; return 0; } case WM_KEYDOWN: { keys[wParam] = TRUE; return 0; } case WM_SIZE: { ReSizeGLScene(LOWORD(lParam), HIWORD(lParam)); return 0; } } return DefWindowProc(hwnd, uMsg, wParam, lParam);}int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ MSG msg; BOOL done = FALSE; if (MessageBox(NULL, "是否在全屏模式下运行?", "提示", MB_YESNO|MB_ICONEXCLAMATION) == IDYES) fullscreen = TRUE; if (!CreateGLWindow("Lesson 3", 640, 480, 16, hInstance, fullscreen)) return 0; while (!done){ if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ if (msg.message == WM_QUIT) done = TRUE; else{ TranslateMessage(&msg); DispatchMessage(&msg); } } else { if (active) { if (keys[VK_ESCAPE]) done = TRUE; else{ DrawGLScene(); SwapBuffers(hDC); } if (keys[VK_F1]){ keys[VK_F1] = FALSE; KillGLWindow(); fullscreen = !fullscreen; if (!CreateGLWindow("Lesson 3", 640, 480, 16, hInstance, fullscreen)) return 0; } } } } KillGLWindow(); return (msg.wParam);}
0 0
- 学习 Nehe Lesson 5
- Lesson 5 Nehe
- NeHe OpenGL lesson 7
- Nehe OpenGL lesson 8
- NeHe OpenGL Lesson 9
- 学习Nehe Lesson 10
- 学习Nehe Lesson 16
- 学习Nehe Lesson 20
- Lesson 1 Nehe
- Lesson 2 Nehe
- Lesson 3 Nehe
- Lesson 4 Nehe
- Lesson 6 Nehe
- Lesson 7 Nehe
- Lesson 8 Nehe
- Lesson 9 Nehe
- Lesson 11 Nehe
- Lesson 12 Nehe
- vb.net发送邮件
- 遇到问题---myeclipse编辑jsp页面卡
- wp开发无法加载设计器解决方法
- ASP.NET支持多语言
- 将一个数据库表的数据复制到另一个数据库表
- Lesson 5 Nehe
- SQL Server 批量插入数据的两种方法
- sp_executesql介绍和使用
- 使用反射自动添加sql参数
- 当进行数据量大的更新时显示正在更新的动画
- Java IO Overview
- SQL SERVER SA密码忘记,windows集成身份验证都登录不了不怎么办
- NPOI2.0操作导出excel
- async and await 简单的入门