一、 建立工程

O(∩_∩)O~上一节介绍了一种非常容易的OpenGL的搭建方法,这一节将就上一节介绍的VC6.0企业版自带的OpenGL Win32 Application建立一个模板工程,并分析这个模板工程,便于今后我们在此基础上进行修改~

PS: 如果有报错,请仔细读上一节的介绍哦~好像Win8不行的!


二、 框架逻辑分析

O(∩_∩)O~工程建好之后主要的就是上图中用红框框起来的文件

  2-1、 OpenGL1.cpp分析

其中OpenGL1.cpp就是Win32应用程序的主逻辑框架啦~由下面OpenGL1.h中主要代码可以看出该文件和Win32原框架很像,主要由初始化窗口、消息回调、退出等组成:

①InitInstance负责产生并显示窗口;

②ExitInstance()什么都没有;

③OnCommand()消息回调,这里只有一个IDM_EXIT消息发送WM_CLOSE;

④WindowProc()窗口消息回调函数及相关窗口消息都在此处理;

剩下几个注释很明白~

 /////////////////////////////////////////////////////////////////////////////
// CApp
// Application class class CApp
{
protected:
HINSTANCE m_hInst;
CMainWnd* m_pMainWnd; public:
CApp();
~CApp(); int Run(); // Starts the message pump
void OnIdle(); // Called when there are no messages in the message queue.
// Sets current OpenGL RC and notifies the main window class that another frame
// is to be drawn.
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow, LPSTR lpCmdLine);
// Called when the application starts. Creates and shows the main window.
void ExitInstance(); // Called when the application exits.
BOOL OnCommand(int nCmdID, int nEvent);// Handles WM_COMMAND messages
LRESULT WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
// Handles messages sent to the main window
void OnPaint(HDC hDC); // Handles WM_PAINT messages. Redraws the OpenGL scene.
void OnDestroy(); // Called when the main window is destroyed. Shuts down OpenGL
void OnCreate(); // Called when the main window has been created. Initializes OpenGL.
void OnSize(int cx, int cy);// Called when the main window is resized. Resizes the OpenGL
};

  2-2、 OpenGL1.cpp分析

其中OpenGL1.cpp就是来处理OpenGL的相关东西,从下面的OpenGL1.h可以看出:

其大致由初始化函数、绘制函数、计时器函数、绘制函数和结束函数组成,这里特别说明计时器函数是用来定时更新一些变量来使3D图呈现运动的效果的,这个在MFC\C#\Win32中经常见到,和安卓游戏开发中logic()函数效果差不多~今后我们无特殊情况基本上都是在这几个函数中修改来呈现各种效果的~

 class CMainWnd
{
public:
CMainWnd();
virtual ~CMainWnd(); HWND m_hWnd;
HGLRC m_hRC; // Handle to RC
GLfloat m_fAngle; // Rotation angle of the cube void DrawScene();
void KillScene();
void InitScene();
void Tick(BOOL &bRedrawScene);
};

三、本例程细节

对于本模板带的绘制例子,这里大致分析下:

>_<" 首先看void CMainWnd::InitScene()函数主要是设置灯光和材质(现在先别管具体函数是啥,大致知道是这个就行)

 //
// InitScene()
// Called when the OpenGL RC has been created. Sets the initial state for
// the OpenGL scene.
//
void CMainWnd::InitScene()
{
glClearColor(0.000f, 0.000f, 0.000f, 1.0f); //Background color // TODO: Replace the following sample code with your initialization code. // Activate lighting and a light source
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST); // Define material parameters
static GLfloat glfMatAmbient[] = {0.000f, 0.450f, 1.000f, 1.0f};
static GLfloat glfMatDiffuse[] = {0.000f, 0.000f, 0.580f, 1.0f};
static GLfloat glfMatSpecular[]= {1.000f, 1.000f, 1.000f, 1.0f};
static GLfloat glfMatEmission[]= {0.000f, 0.000f, 0.000f, 1.0f};
static GLfloat fShininess = 128.000f; // Set material parameters
glMaterialfv(GL_FRONT, GL_AMBIENT, glfMatAmbient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, glfMatDiffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, glfMatSpecular);
glMaterialfv(GL_FRONT, GL_EMISSION, glfMatEmission);
glMaterialf(GL_FRONT, GL_SHININESS, fShininess);
}

>_<" 其次要看CMainWnd::DrawScene()函数,这个函数在每个时间点被调用来绘制OpenGL3D图。这里主要清空缓存、加载光源、加载镜头、绘制正方体(这里正方体封装到GLCube(-r, -r, -r, r, r, r);函数中。

 //
// DrawScene()
// Called each time the OpenGL scene has to be drawn.
//
void CMainWnd::DrawScene()
{
// TODO: Replace the following sample code with your code to draw the scene. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear buffers
glLoadIdentity(); // Load identity matrix // Add a light source
GLfloat glfLight[] = {-4.0f, 4.0f, 4.0f, 0.0f};
glLightfv(GL_LIGHT0, GL_POSITION, glfLight); // Position and rotate the camera
glTranslatef(0.0f, 0.0f, -5.0f);
glRotatef(30.0f, 1.0f, 0.0f, 0.0f);
glRotatef(m_fAngle, 0.0f, 1.0f, 0.0f); // Draw a cube
static GLfloat r = .7f;
GLCube(-r, -r, -r, r, r, r); glFlush();
}

>_<" 下面是GLCuBe函数,用来绘制正方体的:由参数知道其输入正方体的左上角和右下角,然后根据这两个点按照顺序绘制正方体在三维空间中的6个面,这样就组成了一个空间中的正方形了。

 //
// GLCube()
// Renders a cube.
//
void GLCube(GLfloat x1, GLfloat y1, GLfloat z1, GLfloat x2, GLfloat y2, GLfloat z2)
{
glBegin(GL_POLYGON);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(x2, y2, z2);
glVertex3f(x1, y2, z2);
glVertex3f(x1, y1, z2);
glVertex3f(x2, y1, z2);
glEnd(); glBegin(GL_POLYGON);
glNormal3f(0.0f, 0.0f, -1.0f);
glVertex3f(x2, y2, z1);
glVertex3f(x2, y1, z1);
glVertex3f(x1, y1, z1);
glVertex3f(x1, y2, z1);
glEnd(); glBegin(GL_POLYGON);
glNormal3f(-1.0f, 0.0f, 0.0f);
glVertex3f(x1, y2, z2);
glVertex3f(x1, y2, z1);
glVertex3f(x1, y1, z1);
glVertex3f(x1, y1, z2);
glEnd(); glBegin(GL_POLYGON);
glNormal3f(1.0f, 0.0f, 0.0f);
glVertex3f(x2, y2, z2);
glVertex3f(x2, y1, z2);
glVertex3f(x2, y1, z1);
glVertex3f(x2, y2, z1);
glEnd(); glBegin(GL_POLYGON);
glNormal3f(0.0f, 1.0f, 0.0f);
glVertex3f(x1, y2, z1);
glVertex3f(x1, y2, z2);
glVertex3f(x2, y2, z2);
glVertex3f(x2, y2, z1);
glEnd(); glBegin(GL_POLYGON);
glNormal3f(0.0f, -1.0f, 0.0f);
glVertex3f(x1, y1, z1);
glVertex3f(x2, y1, z1);
glVertex3f(x2, y1, z2);
glVertex3f(x1, y1, z2);
glEnd();
}

四、效果及相关链接

博主主页:http://www.cnblogs.com/zjutlitao/

所有博客索引:http://www.cnblogs.com/zjutlitao/p/4125085.html

第一节OpenGL环境搭建:http://www.cnblogs.com/zjutlitao/p/3910525.html

[OpenGL] 2、企业版VC6.0自带的Win32-OpenGL工程浅析的更多相关文章

  1. VC6.0 突然打不开dsw 工程文件的解决方案

    在vc编程中,经常遇到dsw工程文件无法打开,或者打开后看不到类和变量的问题.特别是把代码从一台电脑上copy到另一台电脑上以后,常常会碰到这种奇怪的问题.有时在编辑状态下也会发生成员变量或函数提示不 ...

  2. 让VC6.0编译出来的程序支持XP样式或XP风格

    (1)VC6.0编译出来的win32程序不支持winxp样式的原因:微软WINXP系统更新了Comctl32.dll(ver 6.0)这个“XP风格”的控件.为了保留传统的Windows界面风格,特地 ...

  3. VC6.0 OpenGL环境配置及编程基础

    1.一般情况下VC并不携带glut,需要到opengl官网下载,下载地址 http://www.opengl.org/resources/libraries/glut/glut37.zip 解压后 打 ...

  4. [MFC] VS2013版本MFC工程移植到VC6.0上

    :VS虽号称“宇宙最强IDE”,但是有时候安装包太大,动不动就几个G:而且安装好之后也会多出很多几乎很难用到的部分,这对于那些处女座的人如何忍受!本文不是吐槽,而是给出一种在应急场景下,不用安装新版本 ...

  5. VC6.0环境安装STLport-5.2.1

    今天安装STLport,网上搜资料安装好久,都不行,因为STLport 的版本不对,我这是STLport-5.2.1新版本. (注意:下面的步骤都在一个cmd里操作,很简单的原因:环境变量啊) 1.首 ...

  6. VC6.0代码移植到VS2008运行时乱码问题解决

    转载:http://blog.sina.com.cn/s/blog_6d0cbb030101a3cs.html 问题描述:     之前用VC6.0写过一个OpenGL的程序,后来需要将其放到VS20 ...

  7. VC6.0生成的exe文件图标

    以下是我网上收到的方法 我都试过 成功不了 具体说下我遇到的问题 VC6.0生成的exe文件图标是用Icon下几个图标中value值最小的,顺序为IDR_MAINFRAME.IDR_ICONTETYP ...

  8. vc6.0批量编译

    一直想研究一下怎么让电脑批处理编译程序,今天就从vc6开始,做个记录,学习一下. VC可以生成make文件(Project->Export Makefile),在设置好环境变量下,执行NMAKE ...

  9. VC6.0快捷键一览表

    F1 显示帮助,如果光标停在代码的某个字符上,显示MSDN中相应的帮助内容 F2 书签功能: Ctrl+F2 –在某行设置一个书签(再按一次次是取消) F2 –跳到下一个书签位置 Shift+F2 – ...

随机推荐

  1. mysql的sql_mode 模式修改 my.cnf

    1. sql_mode模式 mysql数据库的中有一个环境变量sql_mode,定义了mysql应该支持的sql语法,数据校验等!我们可以通过以下方式查看当前数据库使用的sql_mode: mysql ...

  2. 循序渐进之Spring AOP(6) - 使用@Aspect注解

    前面几节的示例看起来让人沮丧,要记忆如此多的接口.类和继承关系,做各种复杂的配置.好在这些只是一种相对过时的实现方式,现在只需要使用@Aspect注解及表达式就可以轻松的使用POJO来定义切面,设计精 ...

  3. JAXB 2.0 API is being loaded from the bootstrap classloader

    在使用webservice,mule esb等需要jaxb的项目里经常会出现 JAXB 2.0 API is being loaded from the bootstrap classloader这个 ...

  4. VC++ 浅谈VS2010中CMFCToolBar的用法

    本文将给大家介绍Visual Studio 2010中CMFCToolBar的用法,CMFCToolBar可以让用户自定义工具栏图标,使用静态成员函数SetUserImages()将一个CMFCToo ...

  5. LINUX内核分析期末总结

    韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.课程总结 1 ...

  6. Abstract Factory(抽象工厂)模式

    1.意图 提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类. 2.适用性 一个系统要独立于它的产品创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你强调一系列相关 ...

  7. 算法与数据结构实验题 5.2 Missile

    1.题目: 2.解题思路: 把每个点对应的两条半径求出,之后对d1进行升序排序,对应d2也改变位置.其中一个圆心的半径r1确定之后,除去第一个圆包围的点,在其余点中找到另外一个圆的最长的半径r2,此时 ...

  8. 【网站运营】网站被K的原因大总结

    对于广大的站长来说网站被K或者是被降权是经常有的事情,不过我基本上还没有看见过Google的K站情况,也就是给网站降个权什么的处罚.如果你是用了很严重的作弊手段的话,那指定会是被Google给K掉的. ...

  9. Azure china服务状态报告查看网址

    https://www.azure.cn/support/service-dashboard/

  10. 访问https链接方法

    <a id='___szfw_logo___' href='https://credit.szfw.org/CX20160808028375110138.html' target='_blank ...