天天看点

opengl的初始化(VS2013 MFC)

吐血写贴,试了整整一天有木有。。。。。。桑心有木有。。。。。

好了不废话了,先把流程整理一下,然后有时间再解释代码~~~

第一步:新建MFC项目(标准的+单文档)

opengl的初始化(VS2013 MFC)

第二步:在XXXXView.h中添加(我的项目是test2view.h)

#include<Windows.h>

#include<gl/GL.h>

#include<gl/glut.h>

#include<gl/GLU.h>

#include<gl/GLAUX.H>

CClientDC *m_pDC;

public:

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

afx_msg void OnDestroy();

afx_msg void OnSize(UINT nType, int cx, int cy);

BOOL DrawScene();

BOOL bSetupPixelFormat();

void Init();

BOOL SetWindowPixelFormat(CDC *pDC);

BOOL InitGL();

opengl的初始化(VS2013 MFC)

第三步:在XXXXView.cpp中添加声明的函数

1.在PreCreateWindow函数中添加一行代码

cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);//openGL必需的

2.

BOOL Ctest2View::SetWindowPixelFormat(CDC *pDC)

{//定义窗口的像素格式

PIXELFORMATDESCRIPTOR pfd =

{

sizeof(PIXELFORMATDESCRIPTOR),

1,

PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |

PFD_DOUBLEBUFFER | PFD_SUPPORT_GDI,

PFD_TYPE_RGBA,

24,

0, 0, 0, 0, 0, 0,

0,

0,

0,

0, 0, 0, 0,

32,

0,

0,

PFD_MAIN_PLANE,

0,

0, 0, 0

};

int nIndex = ChoosePixelFormat(pDC->GetSafeHdc(), &pfd);

if (nIndex == 0)

return FALSE;

return SetPixelFormat(pDC->GetSafeHdc(), nIndex, &pfd);

}

BOOL Ctest2View::InitGL() // All Setup For OpenGL Goes Here

{

glShadeModel(GL_SMOOTH); // Enable Smooth Shading

glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Black Background

glClearDepth(1.0f);      // Depth Buffer Setup

glEnable(GL_DEPTH_TEST);  // Enables Depth Testing

glDepthFunc(GL_LEQUAL);  // The Type Of Depth Testing To Do

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);// Really Nice Perspective Calculations

return TRUE;      // Initialization Went OK

}

int Ctest2View::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

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

return -1;

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

m_pDC = new CClientDC(this);

SetWindowPixelFormat(m_pDC);

HGLRC hrc = wglCreateContext(m_pDC->GetSafeHdc());

wglMakeCurrent(m_pDC->GetSafeHdc(), hrc);

InitGL();

return 0;

}

void Ctest2View::OnDestroy()

{

CView::OnDestroy();

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

HGLRC hrc = wglGetCurrentContext();

wglMakeCurrent(NULL, 0);

wglDeleteContext(hrc);

delete m_pDC;

}

BOOL Ctest2View::DrawScene()

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

glTranslatef(-1.5f, 0.0f, -6.0f);       // 左移 1.5 单位,并移入屏幕 6.0

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单位

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

glBegin(GL_QUADS);          // 绘制正方形

glVertex3f(-1.0f, 1.0f, 0.0f);       // 左上

glVertex3f(1.0f, 1.0f, 0.0f);       // 右上

glVertex3f(1.0f, -1.0f, 0.0f);       // 左下

glVertex3f(-1.0f, -1.0f, 0.0f);       // 右下

glEnd();

SwapBuffers(m_pDC->GetSafeHdc());

return TRUE;

}

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

{

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

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

GLsizei width, height;

width = cx;

height = cy;

if (height == 0)    // Prevent A Divide By Zero By

{

height = 1;     // Making Height Equal One

}

glViewport(0, 0, width, height);   // Reset The Current Viewport

glMatrixMode(GL_PROJECTION);   // Select The Projection Matrix

glLoadIdentity();       // Reset The Projection Matrix

// Calculate The Aspect Ratio Of The Window

gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);//透视投影

glMatrixMode(GL_MODELVIEW);   // Select The Modelview Matrix

glLoadIdentity();     // Reset The Modelview Matrix

}

3.在OnDraw函数中添加一行代码

DrawScene();

第四步:还是在XXXXView.cpp中添加以下命令

ON_WM_CREATE()

ON_WM_DESTROY()

ON_WM_SIZE()

opengl的初始化(VS2013 MFC)

第五步:编译运行

opengl的初始化(VS2013 MFC)

具体为什么添加这些函数,每句有什么含义~~大家自行学习喔~~~有问题随时留言~~

http://blog.csdn.net/awsqsh/article/details/6010272

这个帖子也有相应的说明,可以两个结合起来学习喔~~