opengl的初始化(VS2013 MFC)

来源:互联网 发布:java 多线程并发 编辑:程序博客网 时间:2024/05/19 20:49

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

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

第一步:新建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();




第三步:在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()


第五步:编译运行


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


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

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

0 0
原创粉丝点击