----要学习OpenGL 编程,希望读者具备基本的图形知识。本文使用基于Visual C ++消息驱动编程,对于没学过VC 的读者也有一定的帮助。我们的第一个程序将明建立一个视窗程序显示OpenGL 图形的最小需求。为成这一任务我们将分如下5 步来进行:
----要学习OpenGL 编程,希望读者具备基本的图形知识。本文使用基于Visual C ++消息驱动编程,对于没学过VC 的读者也有一定的帮助。我们的第一个程序将明建立一个视窗程序显示OpenGL 图形的最小需求。为成这一任务我们将分如下5 步来进行:
----1 设置窗口像素的格式;2 建立RC;3 使RC 设为当前;4 创建视口和矩阵模型;5 画一个立方体和一个茶壶。
----现在你可以打开你的Visual C ++,建立一个单文档的项目。首先我们在该项目中加进所有必需的OpenGL 文件和库,在菜单中选择Build Settings,然后点击LINK 按钮( 或者按Ctrl +Tab 键来移动到那儿)。在Object/Library 栏中键入Opengl32.lib glu32.lib glaux.lib, 并确定。打开文件stdafx.h 插入如下行:
#include < gl\gl.h >
#include < gl\glu.h >
#include < gl\glaux.h >
----OpenGL 仅能在具有WS_CLIPCHILDREN 和WS_CLIPSIBLINGS 类型的窗口显示图形,我们需要编辑OnPreCreate 函数,指定一下窗口类型。
BOOL COPView::PreCreateWindow(CREATESTRUCT &cs)
{cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
return CView::PreCreateWindow(cs);
}
----下面我们要定义窗口的像素格式,这一点对建立RC 很重要。首先我们需要建立一个受保护的成员函数BOOL SetWindowPixelFormat(HDC hDC)。如下所示:
BOOL COPView::SetWindowPixelFormat(HDC hDC)
{
PIXELFORMATDESCRIPTOR pixelDesc;
pixelDesc.nSize = sizeof(PIXELFORMATDESCRIP
TOR);
pixelDesc.nVersion = 1;
pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL |
PFD_SUPPORT_GDI |PFD_STEREO_DONTCARE;
pixelDesc.iPixelType = PFD_TYPE_RGBA;
pixelDesc.cColorBits = 32;
pixelDesc.cRedBits = 8;
pixelDesc.cRedShift = 16;
pixelDesc.cGreenBits = 8;
pixelDesc.cGreenShift = 8;
pixelDesc.cBlueBits = 8;
pixelDesc.cBlueShift = 0;
pixelDesc.cAlphaBits = 0;
pixelDesc.cAlphaShift = 0;
pixelDesc.cAccumBits= 64;
pixelDesc.cAccumRedBits = 16;
pixelDesc.cAccumGreenBits = 16;
pixelDesc.cAccumBlueBits = 16;
pixelDesc.cAccumAlphaBits= 0;
pixelDesc.cDepthBits = 32;
pixelDesc.cStencilBits= 8;
pixelDesc.cAuxBuffers = 0;
pixelDesc.iLayerType= PFD_MAIN_PLANE;
pixelDesc.bReserved = 0;
pixelDesc.dwLayerMask= 0;
pixelDesc.dwVisibleMask= 0;
pixelDesc.dwDamageMask= 0;
m_GLPixelIndex = ChoosePixelFormat( hDC, &pixelDesc);
if (m_GLPixelIndex==0) // Let's choose a default index.
{
m_GLPixelIndex = 1;
if (DescribePixelFormat(hDC, m_GLPixelIndex, sizeof
(PIXELFORMATDESCRIPTOR), &pixelDesc)==0)
{
return FALSE;
}
}
if (SetPixelFormat( hDC, m_GLPixelIndex,
&pixelDesc)==FALSE)
{
return FALSE;
}
return TRUE;
}
----加入一个成员变量到视类中:
int m_GLPixelIndex; // protected
----最后,在ClassWizard 中加入函数OnCreate 来响应消息WM_CREATE,函数如下:
int COPView::OnCreate
(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
HWND hWnd = GetSafeHwnd();
HDC hDC = ::GetDC(hWnd);
if (SetWindowPixelFormat(hDC)==FALSE)
return 0;
if (CreateViewGLContext(hDC)==FALSE)
return 0;
return 0;
}
----下面需要作的步骤就是建立RC,并置为当前RC。
----在视类中加入保护函数CreateViewGLContext(HDC hDC) 和变量HGLRC m_hGLContext:
BOOL COPView::CreateViewGLContext(HDC hDC)
{
m_hGLContext = wglCreateContext(hDC);
if (m_hGLContext == NULL)
{
return FALSE;
}
if (wglMakeCurrent(hDC, m_hGLContext)==FALSE)
{
return FALSE;
}
return TRUE;
}
加入函数OnDestroy 来响应WM_DESTROY: