関数"void CCube0Dlg::Init()"を追加する。
void CCube0Dlg::Init()
{
// CTopAppのOnIdle用にビューへのポインタを設定
((CCube0App*)AfxGetApp())->pView = this;
if (m_hRC) {
wglMakeCurrent(0, 0);
wglDeleteContext(m_hRC);
m_hRC = NULL;
}
if (m_pDC) delete m_pDC;
m_pDC = new CClientDC(this);
static PIXELFORMATDESCRIPTOR pfd = {
sizeof (PIXELFORMATDESCRIPTOR), // strcut size
1, // Version number
PFD_DRAW_TO_WINDOW | // Flags, draw to a window,
PFD_SUPPORT_OPENGL | // use OpenGL
PFD_DOUBLEBUFFER, // use OpenGL
PFD_TYPE_RGBA, // RGBA pixel values
24, // 24-bit color
0, 0, 0, // RGB bits & shift sizes.
0, 0, 0, // Don't care about them
0, 0, // No alpha buffer info
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, // No layer mask
0, // No visible mask
0 // No damage mask
};
int nMyPixelFormatID;
nMyPixelFormatID = ChoosePixelFormat( m_pDC->GetSafeHdc(), &pfd );
SetPixelFormat( m_pDC->GetSafeHdc(), nMyPixelFormatID, &pfd );
m_hRC = wglCreateContext(m_pDC->GetSafeHdc());
if (!m_hRC) {
AfxMessageBox("OpenGLの初期化に失敗しました");
exit(1);
}
wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f) ;
// ビュー設定
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40, 1, 0.1, 200);
/// Zバッファー(デプス・バッファー)の有効化
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
//// 光源の有効化と色をセット
//// 光源は、たいていLIGHT0 からLIGHT7まで使えます
//// 使う光源は、glEnableで有効化してやります
glEnable(GL_LIGHTING) ; // Enable lighting
glEnable(GL_LIGHT0) ; // Light0 ON
}
関数"void CCube0Dlg::Draw()"を追加する。
void CCube0Dlg::Draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;
// カメラセット
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslated(camerax, cameray, cameraz);
glRotated(anglez, 1, 0, 0);
glRotated(anglex, 0, 0, 1);
// オプジェクトセット
glBegin(GL_QUADS);
/// Z軸に垂直な面
glMaterialfv(GL_FRONT,GL_AMBIENT,red);
glNormal3f(0,0,1);
glVertex3f(-1,-1,1);
glVertex3f( 1,-1,1);
glVertex3f( 1, 1,1);
glVertex3f(-1, 1,1);
glNormal3f(0,0,-1);
glVertex3f(-1,-1,-1);
glVertex3f( 1,-1,-1);
glVertex3f( 1, 1,-1);
glVertex3f(-1, 1,-1);
/// X軸に垂直な面
glMaterialfv(GL_FRONT,GL_AMBIENT,green);
glNormal3f(1,0,0);
glVertex3f(1,-1, 1);
glVertex3f(1, 1, 1);
glVertex3f(1, 1,-1);
glVertex3f(1,-1,-1);
glNormal3f(-1,0,0);
glVertex3f(-1,-1, 1);
glVertex3f(-1, 1, 1);
glVertex3f(-1, 1,-1);
glVertex3f(-1,-1,-1);
/// Y軸に垂直な面
glMaterialfv(GL_FRONT,GL_AMBIENT,blue);
glNormal3f(0,1,0);
glVertex3f(-1, 1, 1);
glVertex3f( 1, 1, 1);
glVertex3f( 1, 1,-1);
glVertex3f(-1, 1,-1);
glNormal3f(0,-1,0);
glVertex3f(-1,-1, 1);
glVertex3f( 1,-1, 1);
glVertex3f( 1,-1,-1);
glVertex3f(-1,-1,-1);
glEnd();
glFinish();
SwapBuffers(m_pDC->GetSafeHdc());
}