一、 建立工程

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. 1-11 ICMP协议

    ICMP协议 IP不提供可靠的传输服务,也不提供端到端或点到点的确认,如果出错可以通过ICMP报告来看,它在IP模块中实现.TCP/IP协议设计了ICMP就是为了弥补IP协议的不足. 它是TCP/IP ...

  2. ProtoType(原型)-对象创建型模式

    1.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.动机 通过拷贝或者“克隆”一个类的实例来创建新的实例. 3.适用性 当一个系统应该独立于它的产品创建.构成和表示时,要使 ...

  3. AS错误:Please configure your build for VectorDrawableCompat.

    运行第一个Android Stdio程序就出现下面这个问题,由于对Android Stdio不熟悉整了三个小时才解决,希望这篇博客能帮助更多的人. 问题:Caused by:java.lang.Run ...

  4. springMVC配置(XML配置详解)

    原文出自:http://www.newasp.net/tech/71609.html web.xml配置: servlet> <servlet-name>dispatcher< ...

  5. 最长子串 FZU2118

    http://acm.fzu.edu.cn/problem.php?pid=2128 分析:利用strstr()函数将每个字串在原串中的首尾位置存储一下,再将首尾从小到大排一下序.(写着写着就感觉和看 ...

  6. Java语言环境(JDK的安装教学)

    //此文档由徐浩军编写(32/64位系统都适用) 1.下载JDK安装包你 2.点击安装包开始安装 3.首先你要选择安装地址一般情况下,都会选择默认地址. (请记住这个地址,之后配置环境变量的时候需要用 ...

  7. c++ 递归斐波那契算法及时间复杂度

    #include<iostream> int fib(int n){ ) return n; else ) + fib(n-); } int main(){ ;i<;i++){ st ...

  8. ubuntu14.04 的网络配置

    为eth0 配置网络 vi /etc/network/intefaces 添加以下内容 auto eth0 iface eth0 inet static address 192.168.0.10 ne ...

  9. C# 使用js正则表达式,让文本框只能输入数字和字母,最大长度5位

    使用js正则表达式,让文本框只能输入数字和字母,最大长度5位,只需要加个onkeyup事件,即可简单实现 <asp:TextBox ID="txtBegin" runat=& ...

  10. ADB 常用命令总结(持续更新)

    1.adb devices 2.抓取adb log:adb logcat -v time >test.log  (Log直接保存在个人电脑用户名下) 3.adb install 包地址(可以直接 ...