最近开始准备做OpenGL方面的东西,万事开头难,真是体会颇深,简直就是寸步难行。有时候发各帖子到网上,不停地刷新,希望能有高手指点,可是,每次收获并不是太大。也许,每个程序员都有一个痛苦的过程,我当然不能例外了。不过,痛苦之后有收获才是最大的快乐。
正因为这个原因,当我度过了自己的第一难关时,心里爽死了;不过,想到自己的痛苦经历,真是往事不堪回首;想必还会有人不断地开始学习OpenGL吧,希望我写出来的东西,能减轻他们的痛苦经历。
在MFC下编OpenGL的程序,首先要设置环境:
首先在XXView.h下,加入头文件
#include"gl\gl.h"
#include"gl\glu.h"
#include"gl\glaux.h"
然后再把下面的文件加入到自己的工程中。
VC所在的盘:\Program Files\Microsoft Visual Studio\VC98\Lib\OPENGL32.LIB
VC所在的盘:\Program Files\Microsoft Visual Studio\VC98\Lib\GLU32.LIB.LIB
VC所在的盘:\Program Files\Microsoft Visual Studio\VC98\Lib\GLAUX.LIB.LIB
可能有些你目前用不到,不过没有关系,以后再用就不用改了。
下面是主要的四部分:
4-1:
void CMySunView::OnInitialUpdate()
{
CView::OnInitialUpdate();
//
m_pDC = new CClientDC(this);
m_hDC=m_pDC->GetSafeHdc();
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_PixelFormat;
m_PixelFormat = ::ChoosePixelFormat(m_hDC, &pfd);
::SetPixelFormat(m_hDC, m_PixelFormat, &pfd);
//
m_hRC = ::wglCreateContext( m_hDC );
wglMakeCurrent( m_hDC, m_hRC );
}
4-2:
void CMySunView::OnDraw(CDC* pDC)
{
CMySunDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//
::glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
float size=100.0f;
glLineWidth(3.0f); //
// axis -- x
glColor3f(1,0,0);
glBegin(GL_LINES);
glVertex3f(-size,0,0);
glVertex3f(size,0,0);
glEnd();
// axis -- y
glColor3f(0,1,0);
glBegin(GL_LINES);
glVertex3f(0,-size,0);
glVertex3f(0,size,0);
glEnd();
// axis -- z
glColor3f(0,0,1);
glBegin(GL_LINES);
glVertex3f(0,0,-size);
glVertex3f(0,0,size);
glEnd();
//
glLineWidth(1.0f); // ssj
::glFinish();
SwapBuffers( m_hDC );
}
4-3
void CMySunView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
//
if ( 0 >= cx || 0 >= cy )
return;
::glClearColor(0.0f, 0.0f, 0.0f, 255.0f);
// specify the back of the buffer as clear depth
::glClearDepth(1.0f);
// enable depth testing
::glEnable(GL_DEPTH_TEST);
::glViewport(0, 0, cx, cy);
::glMatrixMode( GL_PROJECTION );
::glLoadIdentity();
::glOrtho( xOrg - xMax, xOrg + xMax, yOrg - yMax, yOrg + yMax,
zOrg-zMax, zOrg + zMax);
::glRotatef( xrotate, 1.0f, 0.0f, 0.0f );
::glRotatef( yrotate, 0.0f, 1.0f, 0.0f );
::glRotatef( zrotate, 0.0f, 0.0f, 1.0f );
::glMatrixMode( GL_MODELVIEW);
::glLoadIdentity();
Invalidate();
}
4-4
BOOL CMySunView::OnEraseBkgnd(CDC* pDC)
{
return true;
}
void CMySunView::OnDestroy()
{
CView::OnDestroy();
wglDeleteContext(m_hRC);
}
CMySunView::CMySunView()
{
xrotate=45.0f;
yrotate=0.0f;
zrotate=-15.0f;
xOrg=0, xMax=42;
yOrg=0, yMax=70;
zOrg=0, zMax=40;
}
class CMySunView : public CView
{
..........
public:
HGLRC m_hRC;
HDC m_hDC;
CDC* m_pDC;
int width,height;
float xrotate;
float yrotate;
float zrotate;
float xOrg, xMax;
float yOrg, yMax;
float zOrg, zMax;
.........
}
上面是主要的步骤,当然,其他个性化的东西都可以添加上去,这是最小化的最基本的东西,可能也会有不妥地地方,不过已经能看到东西了。
我想程序这么简单就不要做太多的解释了,有兴趣的话,继续探讨。