学习OpenGL总结一
来源:互联网 发布:chimee蒙文软件下载 编辑:程序博客网 时间:2024/04/29 19:56
- 学习OpenGL总结一
- OpenGL_FirstWin32.h 内容如下:
- #pragma once
- #include "resource.h"
- #include <gl/gl.h> //OpenGL32库的头文件
- #include <gl/glu.h> //GLu32库的头文件
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- class OpenGLFrameWork
- {
- public :
- OpenGLFrameWork();
- ~OpenGLFrameWork();
- public:
- GLvoid ReSizeGLScene(GLsizei width, GLsizei height);
- virtual int InitGL(GLvoid);
- virtual int DrawGLScene(GLvoid);
- int DrawGLScene_4(GLvoid);
- GLvoid KillGLWindow(GLvoid);
- virtual BOOL CreateGLWindow(char* title, int width, int height, int bits, bool
- fullscreenflag);
- protected:
- GLfloat rtri;
- GLfloat rquad;
- GLfloat xrot;
- GLfloat yrot;
- GLfloat zrot;
- GLuint texture[1];
- public :
- HGLRC hRC;
- HDC hDC;
- HWND hWnd;
- HINSTANCE hInstance;
- bool keys[256];
- bool active;
- bool fullscreen;
- };
- OpenGLFrameWork::OpenGLFrameWork()
- {
- this->hRC=NULL;
- this->hDC=NULL;
- this->hWnd=NULL;
- this->active=TRUE;
- this->fullscreen=FALSE;
- for(int i=0;i<256;i++)
- {
- this->keys[i]=FALSE;
- }
- rtri=0;
- rquad=0;
- xrot=0;
- yrot=0;
- zrot=0;
-
- };
- OpenGLFrameWork::~OpenGLFrameWork()
- {
-
- }
- GLvoid OpenGLFrameWork::ReSizeGLScene(GLsizei width, GLsizei height)
- {
- if (height==0)
- {
- 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();
- }
- int OpenGLFrameWork::InitGL(GLvoid)
- {
-
-
-
-
-
- glShadeModel(GL_SMOOTH);
- glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
- glClearDepth(1.0f);
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LEQUAL);
-
- glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
- return TRUE;
- }
- int OpenGLFrameWork::DrawGLScene(GLvoid)
- {
-
-
-
-
-
- return this->DrawGLScene_4();
- }
- GLvoid OpenGLFrameWork::KillGLWindow(GLvoid)
- {
- if (fullscreen)
- {
- ChangeDisplaySettings(NULL,0);
- ShowCursor(TRUE);
- }
- if (!wglMakeCurrent(NULL,NULL))
- {
- MessageBox(NULL,(LPCWSTR)"Release Of DC And RC Failed.",(LPCWSTR)"SHUTDOWN ERROR",MB_OK |
- MB_ICONINFORMATION);
- }
- if (!wglDeleteContext(hRC))
- {
- MessageBox(NULL,(LPCWSTR)"Release Rendering Context Failed.",(LPCWSTR)"SHUTDOWN
- ERROR",MB_OK | MB_ICONINFORMATION);
- }
- hRC=NULL;
- if (hDC && !ReleaseDC(hWnd,hDC))
- {
- MessageBox(NULL,(LPCWSTR)"Release Device Context Failed.",(LPCWSTR)"SHUTDOWN ERROR",MB_OK |
- MB_ICONINFORMATION);
- hDC=NULL;
- }
- if (hWnd && !DestroyWindow(hWnd))
- {
- MessageBox(NULL,(LPCWSTR)"Could Not Release hWnd.",(LPCWSTR)"SHUTDOWN ERROR",MB_OK |
- MB_ICONINFORMATION);
- hWnd=NULL;
- }
- if (!UnregisterClass((LPCWSTR)"OpenGL",hInstance))
- {
- MessageBox(NULL,(LPCWSTR)"Could Not Unregister Class.",(LPCWSTR)"SHUTDOWN ERROR",MB_OK |
- MB_ICONINFORMATION);
- hInstance=NULL;
- }
- }
- BOOL OpenGLFrameWork::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;
- WindowRect.right=(long)width;
- WindowRect.top=(long)0;
- WindowRect.bottom=(long)height;
-
- this->fullscreen=fullscreenflag;
-
- hInstance = GetModuleHandle(NULL);
- wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
- wc.lpfnWndProc = (WNDPROC) WndProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = this->hInstance;
- wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- wc.hbrBackground = NULL;
- wc.lpszMenuName = NULL;
- wc.lpszClassName = (LPCWSTR)"OpenGL";
-
- if (!RegisterClass(&wc))
- {
- MessageBox(NULL,(LPCWSTR)"Failed To Register The Window Class.",
- (LPCWSTR)"ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE;
- }
- if (this->fullscreen)
- {
- DEVMODE dmScreenSettings;
- memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
- dmScreenSettings.dmSize=sizeof(dmScreenSettings);
- dmScreenSettings.dmPelsWidth = width;
- dmScreenSettings.dmPelsHeight = height;
- dmScreenSettings.dmBitsPerPel = bits;
- dmScreenSettings.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
-
- if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
- {
-
- if (MessageBox(NULL,(LPCWSTR)"The Requested Fullscreen Mode Is Not Supported By/n
- Your Video Card. Use Windowed Mode Instead?",(LPCWSTR)"NeHe GL", MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
- {
- this->fullscreen=FALSE;
- }
- else
- {
-
- MessageBox(NULL,(LPCWSTR)"Program Will Now Close.",
- (LPCWSTR)"ERROR",MB_OK|MB_ICONSTOP);
- return FALSE;
- }
- }
- }
- if(this->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,
- (LPCWSTR)"OpenGL",
- (LPCWSTR)title,
- WS_CLIPSIBLINGS|
- WS_CLIPCHILDREN|
- dwStyle,
- 0,0,
- WindowRect.right-WindowRect.left,
- WindowRect.bottom-WindowRect.top,
- NULL,
- NULL,
- hInstance,
- NULL)))
- {
- this->KillGLWindow();
- MessageBox(NULL,(LPCWSTR)"Window Creation Error.",
- (LPCWSTR)"ERROR",MB_OK|MB_ICONEXCLAMATION);
- 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,
- 0,
- 0,
- 0, 0, 0, 0,
- 16,
- 0,
- 0,
- PFD_MAIN_PLANE,
- 0,
- 0, 0, 0
- };
- if (!(this->hDC=GetDC(this->hWnd)))
- {
- this->KillGLWindow();
- 置显示区
- MessageBox(NULL,(LPCWSTR)"Can't Create A GL Device Context.",
- (LPCWSTR)"ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE;
- FALSE
- }
- if (!(PixelFormat=ChoosePixelFormat(this->hDC,&pfd)))
- {
- this->KillGLWindow();
- 显示区
- MessageBox(NULL,(LPCWSTR)"Can't Find A Suitable PixelFormat.",
- (LPCWSTR)"ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE;
- }
- if(!SetPixelFormat(this->hDC,PixelFormat,&pfd))
- {
- this->KillGLWindow();
- 显示区
- MessageBox(NULL,(LPCWSTR)"Can't Set The PixelFormat.",
- (LPCWSTR)"ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE;
- }
- if (!(hRC=wglCreateContext(this->hDC)))
- {
- this->KillGLWindow();
- 显示区
- MessageBox(NULL,(LPCWSTR)"Can't Create A GL Rendering Context.",
- (LPCWSTR)"ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE;
- }
- if(!wglMakeCurrent(this->hDC,this->hRC))
- {
- this->KillGLWindow();
- 显示区
- MessageBox(NULL,(LPCWSTR)"Can't Activate The GL Rendering Context.",
- (LPCWSTR)"ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE;
- }
- ShowWindow(this->hWnd,SW_SHOW);
- SetForegroundWindow(this->hWnd);
- SetFocus(this->hWnd);
- this->ReSizeGLScene(width, height);
-
- if (!this->InitGL())
- GL窗口
- {
- this->KillGLWindow();
- 显示区
- MessageBox(NULL,(LPCWSTR)"Initialization Failed.",
- (LPCWSTR)"ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE;
- }
-
- return TRUE;
- }
- int OpenGLFrameWork::DrawGLScene_4(GLvoid)
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- glTranslatef(-1.5f,0.0f,-6.0f);
- glRotatef(rtri,0.0f,1.0f,0.0f);
- glBegin(GL_TRIANGLES);
- 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, 0.0f);
- glColor3f(0.0f,0.0f,1.0f);
- glVertex3f( 1.0f,-1.0f, 0.0f);
- glEnd();
-
- glLoadIdentity();
- glTranslatef(1.5f,0.0f,-6.0f);
- glRotatef(rquad,0.0f,0.0f,1.0f);
- glColor3f(0.5f,0.5f,1.0f);
- glBegin(GL_QUADS);
- glVertex3f(-1.0f, 1.0f, 0.0f);
- glVertex3f( 1.0f, 1.0f, 0.0f);
- glColor3f(1.0f,0.0f,0.0f);
- glVertex3f( 1.0f,-1.0f, 0.0f);
- glVertex3f(-1.0f,-1.0f, 0.0f);
- glEnd();
- this->rtri-=0.5f;
- this->rquad+=0.35f;
- return TRUE;
- }