OpenGL Programming for Windows MFC
1.Starting OpenGL
黄色は追加・編集
Yellow characters are addition and editing.
1.1 StdAfx.h に OpenGL の include を追加
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
include of OpenGL is added to StdAfx.h
1.2 プロジェクト->設定の link タブで、カテゴリ「一般」または
「インプット」のオブジェクト/ライブラリモジュールに
OpenGL の Import Library 指定を追加。
opengl32.lib glu32.lib glaux.lib
The Import Library designation of OpenGL is added to "object/library module" of the category
"general" or "input" with the "link" tab of the "project->setup" menu.
1.3 XXXView.h に以下のメンバー変数追加
CDC* m_pDC ; // Device Context
HGLRC m_GLRC ; // OpenGL Rendering Context
This member variable addition to XXXView.h.
1.4 XXXView.cpp を編集
1.4.1 PreCreateWindow に以下の行を追加
BOOL CXXXView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN ;
return CView::PreCreateWindow(cs);
}
The above line is added to PreCreateWindow.
1.4.2 OnDraw に以下の行を追加
void CXXXView::OnDraw(CDC* pDC)
{
CXXXDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
DrawGL() ; // Drawing by OpenGL
SwapBuffers(m_pDC->m_hDC) ; // Double buffer
}
The above line is added to OnDraw.
1.4.3 Class Wizard により CXXXView の WM_CREAT - OnCreat を
オーバライドし以下の行を追加
int CXXXView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
m_pDC = new CClientDC(this) ; // Get device context
SetDCPixelFormat(m_pDC->m_hDC) ; // Set OpenGL pixel format
m_GLRC = wglCreateContext (m_pDC->m_hDC); // Create rendering context
wglMakeCurrent (m_pDC->m_hDC, m_GLRC); // Current context set
InitGL() ; // Initalize OpenGL
return 0;
}
Overrid WM_CREAT(OnCreat) of CXXXView by Class Wizard.
Then, add the above line.
1.4.4 Class Wizard により CXXXView の WM_DESTROY(OnDestroy) を
オーバライドし以下の行を追加
void CXXXView::OnDestroy()
{
CView::OnDestroy();
wglMakeCurrent (NULL, NULL); // free current context
wglDeleteContext (m_GLRC); // Delete rendering context
delete m_pDC ; // Release device context
}
Overrid WM_DESTROY(OnDestroy) of CXXXView by Class Wizard.
Then, add the above line.
1.5 The example of SetDCPixelFormat.
int SetDCPixelFormat (HDC hdc)
{
static PIXELFORMATDESCRIPTOR pfd = {
sizeof (PIXELFORMATDESCRIPTOR), // Size of this structure
1, // Version number
PFD_DRAW_TO_WINDOW | // Flags
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA, // RGBA pixel values
24, // 24-bit color
0, 0, 0, 0, 0, 0, // Don't care about these
0, 0, // No alpha buffer
0, 0, 0, 0, 0, // No accumulation buffer
32, // 32-bit depth buffer
0, // No stencil buffer
0, // No auxiliary buffers
PFD_MAIN_PLANE, // Layer type
0, // Reserved (must be 0)
0, 0, 0 // No layer masks
};
int nPixelFormat;
nPixelFormat = ChoosePixelFormat (hdc, &pfd);
if (SetPixelFormat(hdc, nPixelFormat, &pfd) == FALSE) {
// SetPixelFormat error
return FALSE ;
}
if (DescribePixelFormat(hdc, nPixelFormat, sizeof(PIXELFORMATDESCRIPTOR),&pfd) == 0) {
// DescribePixelFormat error
return FALSE ;
}
if (pfd.dwFlags & PFD_NEED_PALETTE) {
// Need palete !
}
return TRUE ;
}
1.6 InitGL , DrawGL
GLint InitGL(void)
{
glClearColor(0.0f, 0.0f, 0.5f, 1.0f) ;
return (0) ;
}
GLint DrawGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;
return(0) ;
}
1.7 Build and Execute
以上の後、ビルド及び実行した時に glClearColor で指定した色(この例では暗めの青)で
ウインドウがクリアされれば OpenGL は動作している。
If window is cleared by dark blue, OpenGL is moving.
色が変わらない場合は OpenGL が動作していないので、特に OnCreat の部分や、OnDraw で
SwapBuffers(シングルバッファ時は glFlush または glFinish)がコールされている事を
確認する事。
next