原创 OpenGL 学习0

2009-12-25 14:39 3086 8 8 分类: 软件与OS
学习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


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
8
关闭 站长推荐上一条 /3 下一条