MFC下OpenGL入门(可以用)

时间:2021-08-24 06:16:23

MFC下OpenGL入门

源文件

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

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

MFC下OpenGL入门(可以用)

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

MFC下OpenGL入门(可以用)
MFC下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).如下图:

MFC下OpenGL入门(可以用)

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. &lbrack;转&rsqb;VS 2012环境下使用MFC进行OpenGL编程

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

  2. opengl入门学习

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

  3. OpenGL入门学习&lpar;转&rpar;

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

  4. &lbrack;转&rsqb;opengl入门例题(读取bmp图片,并显示)

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

  5. OpenGL入门学习&lpar;转载)

    说起编程作图,大概还有很多人想起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&period;4:纹理&sol;贴图Texture

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

随机推荐

  1. &lbrack;转&rsqb; - 在mac的终端中使用sublime打开文件

    在mac的终端中使用sublime打开文件 使用sublime提供的命令行工具.这个命令行工具位于 /Applications/Sublime\ Text\ 2.app/Contents/Shared ...

  2. 线程学习笔记(EventWaitHandler)AutoResetEvent的使用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. Ajax——ajax调用数据总结

    在做人事系统加入批量改动的功能中,须要将前台中的数据传给后台.后台并运行一系列的操作. 通过查询和学习了解到能够通过ajax将值传入到后台,并在后台对数据进行操作. 说的简单点.就是ajax调用后台的 ...

  4. php载入脚本的几种方式对比

    require require_once include include_once 共同点: 都可以在当前 PHP 脚本文件执行时载入另外一个 PHP 脚本文件. require 和 include ...

  5. Cucumber常用关键字

    常用关键字(中英文对应) 对应的测试用例 Feature(功能) test suite (测试用例集) background(背景)   Scenario(场景) test case(测试用例) Sc ...

  6. failed to start process with commandline &&num;39&semi;&percnt;LAUNCHER&lowbar;PATH&percnt; &percnt;LAUNCHER&lowbar;ARGS&percnt;&&num;39&semi;&comma; ErrorCode &equals; &&num;39&semi;0x80070002

    在dotnet core进行开发的时候,需要开发目录直接iis进行部署,然而启动的时候,报异常,我们查看windows下的应用日志发现有个这样的错误信息 Application 'MACHINE/WE ...

  7. 别人的Linux私房菜(18)认识系统服务(daemon)

    完成服务service的程序称为daemon.完成计划性的服务程序如crond是一个daemon. 早期的System V的init管理daemon操作中,系统内核首先调用init,然后init运行系 ...

  8. TFS 安装 扩展包

    TFS 2015以后的版本支持安装扩展插件,我们可以自己开发插件,也可以从市场上下载. 市场地址为:http://go.microsoft.com/fwlink/?LinkId=722825& ...

  9. HTML语言字符编码

    ! ! — 惊叹号Exclamation mark ” " " 双引号Quotation mark # # — 数字标志Number sign $ $ — 美元标志Dollar s ...

  10. 我的博客即将搬运同步至腾讯云&plus;社区,邀请大家一同入驻:https&colon;&sol;&sol;cloud&period;tencent&period;com&sol;developer&sol;support-plan&quest;invite&lowbar;code&equals;i5j7gwrxj9x5

    我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=i5j7gwrxj9x5