- 学习OpenGL总结一
- OpenGL_FirstWin32.h 内容如下:
- #pragma once
- #include "resource.h"
- // Open GL 头文件: vp;hsg date:2008_12_26
- #include <gl/gl.h> //OpenGL32库的头文件
- #include <gl/glu.h> //GLu32库的头文件
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // WndProc的定义
- //定义OpenGL框架类
- class OpenGLFrameWork
- {
- public :
- OpenGLFrameWork();
- ~OpenGLFrameWork();
- public:
- GLvoid ReSizeGLScene(GLsizei width, GLsizei height); // 重置并初始化GL窗口大小
- 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; // X 旋转量 ( 新增 )
- GLfloat yrot; // Y 旋转量 ( 新增 )
- GLfloat zrot; // Z 旋转量 ( 新增 )
- GLuint texture[1]; // 存储一个纹理 ( 新增 )
- public :
- HGLRC hRC; // 永久着色描述表
- HDC hDC; // 私有GDI设备描述表
- HWND hWnd; // 保存我们的窗口句柄
- HINSTANCE hInstance; // 保存程序的实例
- bool keys[256]; // 用于键盘例程的数组
- bool active; // 窗口的活动标志,缺省为TRUE
- bool fullscreen; // 全屏标志缺省设定成全屏模式
- };
- //实现方法 OpenGL框架类
- //初始化类
- OpenGLFrameWork::OpenGLFrameWork()
- {
- this->hRC=NULL; // 永久着色描述表
- this->hDC=NULL; // 私有GDI设备描述表
- this->hWnd=NULL; // 保存我们的窗口句柄
- this->active=TRUE; // 窗口的活动标志,缺省为TRUE
- this->fullscreen=FALSE; // 全屏标志缺省设定成全屏模式TRUE
- for(int i=0;i<256;i++)
- {
- this->keys[i]=FALSE;
- }
- rtri=0;
- rquad=0;
- xrot=0;
- yrot=0;
- zrot=0;
- //texture=;
- };
- OpenGLFrameWork::~OpenGLFrameWork()
- {
- //this->KillGLWindow();
- }
- //重设GLScene大小功能
- GLvoid OpenGLFrameWork::ReSizeGLScene(GLsizei width, GLsizei height) // 重置并初始化GL窗口大小
- {
- if (height==0) // 防止被零除
- {
- height=1; // 将Height设为1
- }
- glViewport(0, 0, width, height); // 重置当前的视口(Viewport)
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- // 计算窗口的外观比例
- gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- //初始化GL功能
- int OpenGLFrameWork::InitGL(GLvoid)
- {
- //if (!LoadGLTextures()) // 调用纹理载入子例程( 新增 )
- //{
- // return FALSE; // 如果未能载入,返回FALSE( 新增 )
- //}
- //glEnable(GL_TEXTURE_2D); // 启用纹理映射( 新增 )
- glShadeModel(GL_SMOOTH); //启用smooth shading(阴影平滑)
- 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; // 初始化 OK
- }
- //绘制场景功能
- int OpenGLFrameWork::DrawGLScene(GLvoid) // 从这里开始进行所有的绘制
- {
- //第一课内容
- //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
- //glLoadIdentity(); // 重置当前的模型观察矩阵
- //return TRUE; // 一切 OK
- //第二课到第四课
- return this->DrawGLScene_4();
- }
- // 正常销毁窗口功能
- GLvoid OpenGLFrameWork::KillGLWindow(GLvoid)
- {
- if (fullscreen) // 我们处于全屏模式吗?
- {
- ChangeDisplaySettings(NULL,0); // 是的话,切换回桌面
- ShowCursor(TRUE); // 显示鼠标指针
- }
- if (!wglMakeCurrent(NULL,NULL)) // 我们能否释放DC和RC描述表?
- {
- MessageBox(NULL,(LPCWSTR)"Release Of DC And RC Failed.",(LPCWSTR)"SHUTDOWN ERROR",MB_OK |
- MB_ICONINFORMATION);
- }
- if (!wglDeleteContext(hRC)) // 我们能否删除RC?
- {
- MessageBox(NULL,(LPCWSTR)"Release Rendering Context Failed.",(LPCWSTR)"SHUTDOWN
- ERROR",MB_OK | MB_ICONINFORMATION);
- }
- hRC=NULL; // 将RC设为 NULL
- if (hDC && !ReleaseDC(hWnd,hDC)) // 我们能否释放 DC?
- {
- MessageBox(NULL,(LPCWSTR)"Release Device Context Failed.",(LPCWSTR)"SHUTDOWN ERROR",MB_OK |
- MB_ICONINFORMATION);
- hDC=NULL; // 将 DC 设为 NULL
- }
- if (hWnd && !DestroyWindow(hWnd)) // 能否销毁窗口?
- {
- MessageBox(NULL,(LPCWSTR)"Could Not Release hWnd.",(LPCWSTR)"SHUTDOWN ERROR",MB_OK |
- MB_ICONINFORMATION);
- hWnd=NULL; // 将 hWnd 设为 NULL
- }
- if (!UnregisterClass((LPCWSTR)"OpenGL",hInstance)) // 能否注销类?
- {
- MessageBox(NULL,(LPCWSTR)"Could Not Unregister Class.",(LPCWSTR)"SHUTDOWN ERROR",MB_OK |
- MB_ICONINFORMATION);
- hInstance=NULL; // 将 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; // 将Left 设为 0
- WindowRect.right=(long)width; // 将Right 设为要求的宽度
- WindowRect.top=(long)0; // 将Top 设为 0
- WindowRect.bottom=(long)height; // 将Bottom 设为要求的高度
- this->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 = this->hInstance; // 设置实例
- wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // 装入缺省图标
- wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 装入鼠标指针
- wc.hbrBackground = NULL; // GL不需要背景
- 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; //退出并返回FALSE
- }
- if (this->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,(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;// 选择窗口模式(Fullscreen=FALSE)
- }
- else
- {
- // Pop Up A Message Box Letting User Know The Program Is Closing.
- MessageBox(NULL,(LPCWSTR)"Program Will Now Close.",
- (LPCWSTR)"ERROR",MB_OK|MB_ICONSTOP);
- return FALSE;//退出并返回 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))) // 不向WM_CREATE传递任何东东
- {
- this->KillGLWindow();// 重置显示区
- MessageBox(NULL,(LPCWSTR)"Window Creation Error.",
- (LPCWSTR)"ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE;// 返回 FALSE
- }
- static PIXELFORMATDESCRIPTOR 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, // 忽略Shift Bit
- 0, // 无聚集缓存
- 0, 0, 0, 0, // 忽略聚集位
- 16, // 16位 Z-缓存 (深度缓存)
- 0, // 无模板缓存
- 0, // 无辅助缓存
- PFD_MAIN_PLANE, // 主绘图层
- 0, // 保留
- 0, 0, 0 // 忽略层遮罩
- }; //pfd 告诉窗口我们所希望的东东
- 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))) // Windows 找到相应的象素格式了吗?
- {
- this->KillGLWindow(); // 重置
- 显示区
- MessageBox(NULL,(LPCWSTR)"Can't Find A Suitable PixelFormat.",
- (LPCWSTR)"ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE; // 返回 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; // 返回 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; // 返回 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; // 返回 FALSE
- }
- ShowWindow(this->hWnd,SW_SHOW);// 显示窗口
- SetForegroundWindow(this->hWnd);// 略略提高优先级
- SetFocus(this->hWnd);// 设置键盘的焦点至此窗口
- this->ReSizeGLScene(width, height); // 设置透视 GL 屏幕
- if (!this->InitGL()) // 初始化新建的
- GL窗口
- {
- this->KillGLWindow(); // 重置
- 显示区
- MessageBox(NULL,(LPCWSTR)"Initialization Failed.",
- (LPCWSTR)"ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE; // 返回 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); // 左移 1.5 单位,并移入屏幕 6.0
- glRotatef(rtri,0.0f,1.0f,0.0f); // 绕Y轴旋转三角形 ( 新增 )
- 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(); // 三角形绘制结束
- //glTranslatef(3.0f,0.0f,0.0f); // 右移3单位
- glLoadIdentity(); // 重置模型观察矩阵
- glTranslatef(1.5f,0.0f,-6.0f); // 右移1.5单位,并移入屏幕 6.0
- glRotatef(rquad,0.0f,0.0f,1.0f); // 绕X轴旋转四边形 ( 新增 )
- 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; // 继续运行
- }
学习OpenGL总结一
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
学习OpenGL总结三
学习OpenGL总结三DrawGLScene_3D.h内容如下://#include"DrawG
3d #include 头文件 -
学习OpenGL总结二
学习OpenGL总结二OpenGL_FirstWin32.cpp:定义应用程序的入口点//OpenG
#include 3d 程序退出