MFC下OpenGL入门

源文件

1, 建一工程文件,我这里命名为first,现在first工程里面我们没有添加任何东西,所有的东西都是MFC自动帮我们创建的。

2, 添加链接库。这一步很关键。打开菜单栏下的项目->属性->配置属性->链接器->输入->附加依赖项里加入OpenGL32.lib GLu32.lib GLaux.lib,如图

3, 加头文件,在stdafx里面添加opengl的头文件。如下代码所示:

 //-----------------------Tramp---添加OpenGL库头文件----------------------------->

#include "stdio.h"

#include "math.h"

#include "gl\gl.h"

#include "gl\glu.h"

#include "gl\glaux.h"

//---------------------------------------------------------------------------<
 

4, CCY457OpenGLView类的属性栏,为下述消息加入消息处理函数:WM_CREATE (for OnCreate), WM_DESTROY (for OnDestroy), WM_SIZE (for OnSize), WM_ERASEBACKGROUND (for OnEraseBkground).如下图:

5, 设置窗口显示风格。窗口创建之前我们必须设置窗口风格包含WS_CLIPCHILDRENWS_CLIPSIBLINGS,从而避免OpenGL绘制到其他窗口中去。这些应该放在PreCreateWindow()中。

 
BOOL CfirstView::PreCreateWindow(CREATESTRUCT& cs)

{

// TODO: 在此处通过修改

// CREATESTRUCT cs 来修改窗口类或样式

 cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;//Tramp

return CView::PreCreateWindow(cs);

}
 

6, 在CfirstView.h中加入如下语句:

/************************************************************************/

/* 设置的变量是Rendering Context(着色描述表)。每一个OpenGL都被连接到一个着

色描述表上。着色描述表将所有的OpenGL调用命令连接到Device Context(设备描述表)上。

我将OpenGL的着色描述表定义为hRC 。要让您的程序能够绘制窗口的话,还需要创建一个

设备描述表,也就是第二行的内容。Windows的设备描述表被定义为hDC 。DC将窗口连接到

GDI(Graphics Device Interface图形设备接口)。而RC将OpenGL连接到DC                                                                     */

/************************************************************************/

HGLRC m_hRC;    //Rendering Context着色描述表

CDC* m_pDC;        //Device Context设备描述表

BOOL InitializeOpenGL();    //Initialize OpenGL

BOOL SetupPixelFormat();    //Set up the Pixel Format

void RenderScene();            //Render the Scene

7, 在OnCreate中我们将通过建立像素格式和绘制上下文来初始化OpenGL. 在InitializeOpenGL()中会创建一个设备上下文(DC),为这个DC选择一个像素格式,创建和这个DC相关的绘制上下文(RC),然后选择这个RC.这个函数会调用SetupPixelFormat()来建立像素格式。

int Clesson1View::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CView::OnCreate(lpCreateStruct) == -1)

return -1;

// TODO: 在此添加您专用的创建代码

InitializeOpenGL();//初始化openGL绘图

return 0;

}

//初始化opengl绘制

BOOL CfirstView::InitializeOpenGL()

{

//Get a DC for the Client Area

m_pDC = new CClientDC(this);

//Failure to Get DC

if(m_pDC == NULL)

{

//::MessageBox("Error Obtaining DC");

return FALSE;

}

//Failure to set the pixel format

if(!SetupPixelFormat())

{

return FALSE;

}

//Create Rendering Context

m_hRC = ::wglCreateContext (m_pDC->GetSafeHdc ());

//Failure to Create Rendering Context

if(m_hRC == 0)

{

// MessageBox("Error Creating RC");

return FALSE;

}

//Make the RC Current

if(::wglMakeCurrent (m_pDC->GetSafeHdc (), m_hRC)==FALSE)

{

// MessageBox("Error making RC Current");

return FALSE;

}

//Specify Black as the clear color

::glClearColor(0.0f,0.0f,0.0f,0.0f);

//Specify the back of the buffer as clear depth

::glClearDepth(1.0f);

//Enable Depth Testing

::glEnable(GL_DEPTH_TEST);

return TRUE;

}

//设置像素格式

BOOL CfirstView::SetupPixelFormat()

{

static PIXELFORMATDESCRIPTOR pfd =

{

sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd

1,                              // version number

PFD_DRAW_TO_WINDOW |            // support window

PFD_SUPPORT_OPENGL |            // support OpenGL

PFD_DOUBLEBUFFER,                // double buffered

PFD_TYPE_RGBA,                  // RGBA type

24,                             // 24-bit color depth

0, 0, 0, 0, 0, 0,               // color bits ignored

0,                              // no alpha buffer

0,                              // shift bit ignored

0,                              // no accumulation buffer

0, 0, 0, 0,                     // accum bits ignored

16,                             // 16-bit z-buffer

0,                              // no stencil buffer

0,                              // no auxiliary buffer

PFD_MAIN_PLANE,                 // main layer

0,                              // reserved

0, 0, 0                         // layer masks ignored

};

int m_nPixelFormat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);

if ( m_nPixelFormat == 0 )

{

return FALSE;

}

if ( ::SetPixelFormat(m_pDC->GetSafeHdc(), m_nPixelFormat, &pfd) == FALSE)

{

return FALSE;

}

return TRUE;

}

8, 在OnSize()中一般用来设置视口和视锥,因为这些是和窗口大小相关的。基本操作包括设置视口,选择投影矩阵,设置模型视图矩阵。

void CfirstView::OnSize(UINT nType, int cx, int cy)

{

CView::OnSize(nType, cx, cy);

// TODO: 在此处添加消息处理程序代码

GLdouble aspect_ratio; // width/height ratio

if ( 0 >= cx || 0 >= cy )

{

return;

}

// select the full client area

::glViewport(0, 0, cx, cy);

// compute the aspect ratio

// this will keep all dimension scales equal

aspect_ratio = (GLdouble)cx/(GLdouble)cy;

// select the projection matrix and clear it

::glMatrixMode(GL_PROJECTION);

::glLoadIdentity();

// select the viewing volume

::gluPerspective(45.0f, aspect_ratio, .01f, 200.0f);//画三维

//::gluOrtho2D(-10.0f, 10.0f, -10.0f, 10.0f);    //二维

// switch back to the modelview matrix and clear it

::glMatrixMode(GL_MODELVIEW);

::glLoadIdentity();

}

9, 在绘制场景时,一般包括如下步骤:1)清空缓存。2)绘制场景。3)Flush掉渲染流水线。4)若设置了双缓冲,则交换前后台缓冲区。

void CfirstView::OnDraw(CDC* /*pDC*/)

{

CfirstDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

// TODO: 在此处为本机数据添加绘制代码

// Clear out the color & depth buffers

::glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

RenderScene();//绘图都放在这

// Tell OpenGL to flush its pipeline

::glFinish();

// Now Swap the buffers

::SwapBuffers( m_pDC->GetSafeHdc() );

}

10,              为了使改变窗口大小时严重的闪烁,在OnEraseBkgnd里做一些操作,避免windows自己的窗口刷新闪烁。

BOOL CfirstView::OnEraseBkgnd(CDC* pDC)

{

// TODO: 在此添加消息处理程序代码和/或调用默认值

return TRUE;

}

11,              为了避免内存泄露,我们要将在SetupPixelFormat()中使用了new运算符来为CClientDC对象分配的内存在程序关闭时delete掉。

void CfirstView::OnDestroy()

{

CView::OnDestroy();

// TODO: 在此处添加消息处理程序代码

//Make the RC non-current

if(::wglMakeCurrent (0,0) == FALSE)

{

MessageBox(_T("Could not make RC non-current"));

}

//Delete the rendering context

if(::wglDeleteContext (m_hRC)==FALSE)

{

MessageBox(_T("Could not delete RC"));

}

//Delete the DC

if(m_pDC)

{

delete m_pDC;

}

//Set it to NULL

m_pDC = NULL;

}

12,      下面写主绘图函数,RenderScene(),在窗口画了一个正方体、一个四面体。

void CfirstView::RenderScene()

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer

glLoadIdentity();                                   // Reset The Current Modelview Matrix

glTranslatef(-1.5f,0.0f,-6.0f);                     // Move Left 1.5 Units And Into The Screen 6.0

glRotatef(30,0.0f,1.0f,0.0f);                       // Rotate The Triangle On The Y axis ( NEW )

glBegin(GL_TRIANGLES);                              // Start Drawing A Triangle

glColor3f(1.0f,0.0f,0.0f);                      // Red

glVertex3f( 0.0f, 1.0f, 0.0f);                  // Top Of Triangle (Front)

glColor3f(0.0f,1.0f,0.0f);                      // Green

glVertex3f(-1.0f,-1.0f, 1.0f);                  // Left Of Triangle (Front)

glColor3f(0.0f,0.0f,1.0f);                      // Blue

glVertex3f( 1.0f,-1.0f, 1.0f);                  // Right Of Triangle (Front)

glColor3f(1.0f,0.0f,0.0f);                      // Red

glVertex3f( 0.0f, 1.0f, 0.0f);                  // Top Of Triangle (Right)

glColor3f(0.0f,0.0f,1.0f);                      // Blue

glVertex3f( 1.0f,-1.0f, 1.0f);                  // Left Of Triangle (Right)

glColor3f(0.0f,1.0f,0.0f);                      // Green

glVertex3f( 1.0f,-1.0f, -1.0f);                 // Right Of Triangle (Right)

glColor3f(1.0f,0.0f,0.0f);                      // Red

glVertex3f( 0.0f, 1.0f, 0.0f);                  // Top Of Triangle (Back)

glColor3f(0.0f,1.0f,0.0f);                      // Green

glVertex3f( 1.0f,-1.0f, -1.0f);                 // Left Of Triangle (Back)

glColor3f(0.0f,0.0f,1.0f);                      // Blue

glVertex3f(-1.0f,-1.0f, -1.0f);                 // Right Of Triangle (Back)

glColor3f(1.0f,0.0f,0.0f);                      // Red

glVertex3f( 0.0f, 1.0f, 0.0f);                  // Top Of Triangle (Left)

glColor3f(0.0f,0.0f,1.0f);                      // Blue

glVertex3f(-1.0f,-1.0f,-1.0f);                  // Left Of Triangle (Left)

glColor3f(0.0f,1.0f,0.0f);                      // Green

glVertex3f(-1.0f,-1.0f, 1.0f);                  // Right Of Triangle (Left)

glEnd();                                            // Done Drawing The Pyramid

glLoadIdentity();                                   // Reset The Current Modelview Matrix

glTranslatef(1.5f,0.0f,-7.0f);                      // Move Right 1.5 Units And Into The Screen 7.0

glRotatef(25,1.0f,1.0f,1.0f);                   // Rotate The Quad On The X axis ( NEW )

glBegin(GL_QUADS);                                  // Draw A Quad

glColor3f(0.0f,1.0f,0.0f);                      // Set The Color To Green

glVertex3f( 1.0f, 1.0f,-1.0f);                  // Top Right Of The Quad (Top)

glVertex3f(-1.0f, 1.0f,-1.0f);                  // Top Left Of The Quad (Top)

glVertex3f(-1.0f, 1.0f, 1.0f);                  // Bottom Left Of The Quad (Top)

glVertex3f( 1.0f, 1.0f, 1.0f);                  // Bottom Right Of The Quad (Top)

glColor3f(1.0f,0.5f,0.0f);                      // Set The Color To Orange

glVertex3f( 1.0f,-1.0f, 1.0f);                  // Top Right Of The Quad (Bottom)

glVertex3f(-1.0f,-1.0f, 1.0f);                  // Top Left Of The Quad (Bottom)

glVertex3f(-1.0f,-1.0f,-1.0f);                  // Bottom Left Of The Quad (Bottom)

glVertex3f( 1.0f,-1.0f,-1.0f);                  // Bottom Right Of The Quad (Bottom)

glColor3f(1.0f,0.0f,0.0f);                      // Set The Color To Red

glVertex3f( 1.0f, 1.0f, 1.0f);                  // Top Right Of The Quad (Front)

glVertex3f(-1.0f, 1.0f, 1.0f);                  // Top Left Of The Quad (Front)

glVertex3f(-1.0f,-1.0f, 1.0f);                  // Bottom Left Of The Quad (Front)

glVertex3f( 1.0f,-1.0f, 1.0f);                  // Bottom Right Of The Quad (Front)

glColor3f(1.0f,1.0f,0.0f);                      // Set The Color To Yellow

glVertex3f( 1.0f,-1.0f,-1.0f);                  // Top Right Of The Quad (Back)

glVertex3f(-1.0f,-1.0f,-1.0f);                  // Top Left Of The Quad (Back)

glVertex3f(-1.0f, 1.0f,-1.0f);                  // Bottom Left Of The Quad (Back)

glVertex3f( 1.0f, 1.0f,-1.0f);                  // Bottom Right Of The Quad (Back)

glColor3f(0.0f,0.0f,1.0f);                      // Set The Color To Blue

glVertex3f(-1.0f, 1.0f, 1.0f);                  // Top Right Of The Quad (Left)

glVertex3f(-1.0f, 1.0f,-1.0f);                  // Top Left Of The Quad (Left)

glVertex3f(-1.0f,-1.0f,-1.0f);                  // Bottom Left Of The Quad (Left)

glVertex3f(-1.0f,-1.0f, 1.0f);                  // Bottom Right Of The Quad (Left)

glColor3f(1.0f,0.0f,1.0f);                      // Set The Color To Violet

glVertex3f( 1.0f, 1.0f,-1.0f);                  // Top Right Of The Quad (Right)

glVertex3f( 1.0f, 1.0f, 1.0f);                  // Top Left Of The Quad (Right)

glVertex3f( 1.0f,-1.0f, 1.0f);                  // Bottom Left Of The Quad (Right)

glVertex3f( 1.0f,-1.0f,-1.0f);                  // Bottom Right Of The Quad (Right)

glEnd();                                            // Done Drawing The Quad

}

 

MFC下OpenGL入门(可以用)的更多相关文章

  1. [转]VS 2012环境下使用MFC进行OpenGL编程

    我就不黏贴复制了,直接给出原文链接:VS 2012环境下使用MFC进行OpenGL编程 其它好文链接: 1.OpenGL系列教程之十二:OpenGL Windows图形界面应用程序

  2. opengl入门学习

    OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...

  3. OpenGL入门学习(转)

    OpenGL入门学习 http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 说起编程作图,大概还有很多人想起TC的#includ ...

  4. [转]opengl入门例题(读取bmp图片,并显示)

    #include<gl/glut.h> #define FileName "bliss.bmp" static GLint imagewidth; static GLi ...

  5. OpenGL入门学习(转载)

    说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色 ...

  6. SCARA——OpenGL入门学习五六(三维变换、动画)

    OpenGL入门学习(五) 此课为三维变换的内容,比较枯燥.主要是因为很多函数在单独使用时都不好描述其效果, 在前面绘制几何图形的时候,大家是否觉得我们绘图的范围太狭隘了呢?坐标只能从-1到1,还只能 ...

  7. SCARA——OpenGL入门学习四(颜色)

    OpenGL入门学习[四] 本次学习的是颜色的选择.终于要走出黑白的世界了~~ OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. 无论哪种颜色模式,计算机都必须为每一个像素保存一些数 ...

  8. 关于MFC与OpenGL结合绘图区域用鼠标来控制图形的移动的坑

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11773171.html 之前开发的导入多个模型,旋转,分别移动什么什么的,都是在纯OpenGL ...

  9. OpenGL入门1.4:纹理/贴图Texture

    每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 前言 游戏玩家对Texture这个词应该不陌生,我们已经知道了怎么为每个顶点添加颜色来增加图形的细节,但,如果想让图形看起来更真实 ...

随机推荐

  1. Android中的动画效果

    动画的种类 透明动画alphaAnimation 在代码中配置动画: findViewById(R.id.btnAnimMe).setOnClickListener(new View.OnClickL ...

  2. UVA 11297 线段树套线段树(二维线段树)

    题目大意: 就是在二维的空间内进行单个的修改,或者进行整块矩形区域的最大最小值查询 二维线段树树,要注意的是第一维上不是叶子形成的第二维线段树和叶子形成的第二维线段树要  不同的处理方式,非叶子形成的 ...

  3. 面试复习(C++)之直接插入排序

    #include <iostream> using namespace std; void Insertsort(int *a,int len) { ;j<len;j++) { in ...

  4. Microsoft Word 段前距设置和页眉设置

    在毕设论文整理中,段前距的设置和页眉的设置不起作用,这着实让我脑袋疼.网上搜索了几种方式,搭配一下还是起了作用. 一. 段前距设置 1. 各级标题在首页,段前距设置不起作用. 选择要段前分页的段落,右 ...

  5. DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版及制作Visual Studio C#项目模板文件详解

    关于 DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...

  6. oracle 用户创建这个挺靠谱

    CREATE TEMPORARY TABLESPACE test_tempTEMPFILE 'C:\oracle\product\10.1.0\oradata\orcl\test_temp01.dbf ...

  7. JAVA时间格式转换大全

    import java.text.*; import java.util.Calendar; public class VeDate { /** * 获取现在时间 * * @return 返回时间类型 ...

  8. ubuntu下code::blocks+opengl的使用与配置

    操作系统:Ubuntu 15.04 gcc version 4.9.2 opengl安装 sudo apt-get install build-essential libgl1-mesa-dev li ...

  9. The Pragmatic Programmer Quick Reference Guide

    1.关心你的技艺 Care About Your Craft 如果不在乎能否漂亮地开发出软件,你又为何要耗费生命去开发软件呢? 2.思考!你的工作 Think! About Your Work 关掉自 ...

  10. vs2013源码编译zlib 1.2.8

    1.从 zlib 官网上下载 zlib最新版 1.28 的源码,解压到 zlib-1.2.8 2.使用vs2013打开vc11目录下的sln工程文件(进行单向升级) 3.修改zlibvc工程属性--& ...