学习OpenGL过程中
所编写的学习程序,从网上搜集整理改写而成,如果你第一次接触OpenGL,希望这个例子对你有所帮助,欢迎同行共同探讨。
在View中画一个简单的三角形,如下图所示,
首先,在stdafx.h文件中包含相关头文件gl.h和glu.h,如下图所示,
然后,在项目属性页中添加opengl32.lib和glu32.lib,如下图所示,
所需的动态连接库opengl32.dll和glu32.dll位于目录c:\windows\system32下,
相关代码如下,
// FirstOpenGlView.h : CFirstOpenGlView 类的接口
#pragma once
class CFirstOpenGlView : public CView
{
protected: // 仅从序列化创建
CFirstOpenGlView();
DECLARE_DYNCREATE(CFirstOpenGlView)
// 属性
public:
CFirstOpenGlDoc* GetDocument() const;
// 操作
public:
// 重写
public:
virtual void OnDraw(CDC* pDC); // 重写以绘制该视图
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
// 实现
public:
virtual ~CFirstOpenGlView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// 生成的消息映射函数
protected:
DECLARE_MESSAGE_MAP()
public:
int m_GLPixelIndex;
HDC hDC;
HWND hWnd;
HGLRC hRC;
BOOL SetWindowPixelFormat(HDC hDC);
BOOL CreateGLContext(HDC hDC);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDestroy();
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnPaint();
};
#ifndef _DEBUG // FirstOpenGlView.cpp 中的调试版本
inline CFirstOpenGlDoc* CFirstOpenGlView::GetDocument() const
{ return reinterpret_cast<CFirstOpenGlDoc*>(m_pDocument); }
#endif
// FirstOpenGlView.cpp : CFirstOpenGlView 类的实现
#include "stdafx.h"
#include "FirstOpenGl.h"
#include "FirstOpenGlDoc.h"
#include "FirstOpenGlView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
///////////////////////////////////////////////////////////////////////////////
// CFirstOpenGlView
IMPLEMENT_DYNCREATE(CFirstOpenGlView, CView)
///////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CFirstOpenGlView, CView)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_SIZE()
ON_WM_PAINT()
END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////////
// CFirstOpenGlView 构造/析构
CFirstOpenGlView::CFirstOpenGlView()
{ // TODO: 在此处添加构造代码
hDC = NULL;
hWnd= NULL;
hRC = NULL;
m_GLPixelIndex = 0;
}
///////////////////////////////////////////////////////////////////////////////
CFirstOpenGlView::~CFirstOpenGlView()
{
}
///////////////////////////////////////////////////////////////////////////////
BOOL CFirstOpenGlView::PreCreateWindow(CREATESTRUCT& cs)
{ // TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式
cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
return CView::PreCreateWindow(cs);
}
///////////////////////////////////////////////////////////////////////////////
// CFirstOpenGlView 绘制
void CFirstOpenGlView::OnDraw(CDC* /*pDC*/)
{ CFirstOpenGlDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
}
///////////////////////////////////////////////////////////////////////////////
// CFirstOpenGlView 诊断
#ifdef _DEBUG
void CFirstOpenGlView::AssertValid() const
{ CView::AssertValid();
}
void CFirstOpenGlView::Dump(CDumpContext& dc) const
{ CView::Dump(dc);
}
CFirstOpenGlDoc* CFirstOpenGlView::GetDocument() const // 非调试版本是内联的
{ ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFirstOpenGlDoc)));
return (CFirstOpenGlDoc*)m_pDocument;
}
#endif //_DEBUG
///////////////////////////////////////////////////////////////////////////////
BOOL CFirstOpenGlView::SetWindowPixelFormat(HDC hDC)
{ PIXELFORMATDESCRIPTOR pixelDesc;
pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
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;
}
///////////////////////////////////////////////////////////////////////////////
BOOL CFirstOpenGlView::CreateGLContext(HDC hDC)
{ hRC = wglCreateContext(hDC);
if(hRC == NULL)
return FALSE;
if(wglMakeCurrent(hDC, hRC)==FALSE)
return FALSE;
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// CFirstOpenGlView 消息处理程序
int CFirstOpenGlView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{ if(CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
hWnd = GetSafeHwnd();
hDC = ::GetDC(hWnd); // 在View 中绘图
if(SetWindowPixelFormat(hDC)==FALSE)
return 0;
if(CreateGLContext(hDC)==FALSE)
return 0;
return 0;
}
///////////////////////////////////////////////////////////////////////////////
void CFirstOpenGlView::OnDestroy()
{ CView::OnDestroy();
// TODO: 在此处添加消息处理程序代码
if(wglGetCurrentContext()!=NULL)
wglMakeCurrent(NULL, NULL) ; // make the rendering context not current
if(hRC!=NULL)
{ wglDeleteContext(hRC);
hRC = NULL;
}
if(hWnd!=NULL)
::ReleaseDC(hWnd, hDC);
}
///////////////////////////////////////////////////////////////////////////////
void CFirstOpenGlView::OnSize(UINT nType, int cx, int cy)
{ CView::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
GLsizei width, height;
GLdouble aspect;
width = cx;
height = cy;
if(cy==0)
aspect = (GLdouble)width;
else
aspect = (GLdouble)width/(GLdouble)height;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 500.0*aspect, 0.0, 500.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
///////////////////////////////////////////////////////////////////////////////
void CFirstOpenGlView::OnPaint()
{ CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
glVertex2f(100.0f, 50.0f);
glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
glVertex2f(450.0f, 400.0f);
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glVertex2f(450.0f, 50.0f);
glEnd();
glFlush();
// 不为绘图消息调用 CView::OnPaint()
}
///////////////////////////////////////////////////////////////////////////////
可执行文件如下,
https://static.assets-stash.eet-china.com/album/old-resources/2009/10/6/06266956-fada-4101-a680-6ab97b002886.rar
文章评论(0条评论)
登录后参与讨论