OpenGLプログラミング(準備)
Direct3DとOpenGLどっちにしようと迷ったあげくOpenGLで遊ぶことに。なんかの拍子にPS3で3Dやるかもしれないしネ。
OpenGLは昔にちょろっとポリゴン出したくらいの初心者同然なので、OpenGL本家サイトやGoogle頼りに基本から。
まずWindowsでOpenGLを使うために必要な準備として、レンダーコンテキストの作成から。
ウィンドウを作る→ピクセルフォーマットを選択する→OpenGLレンダーコンテキストを作るの流れ。
ウィンドウ作成はWindowsでプログラム書くときにはあたりまえの行為なのでスルーするとして、以降の手続きはチュートリアルサイトからコピペ。
void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC) { PIXELFORMATDESCRIPTOR pfd; int iFormat; // get the device context (DC) *hDC = GetDC( hWnd ); // set the pixel format for the DC ZeroMemory( &pfd, sizeof( pfd ) ); pfd.nSize = sizeof( pfd ); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 32; pfd.cDepthBits = 16; pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat( *hDC, &pfd ); SetPixelFormat( *hDC, iFormat, &pfd ); // create and enable the render context (RC) *hRC = wglCreateContext( *hDC ); wglMakeCurrent( *hDC, *hRC ); } void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC) { wglMakeCurrent( NULL, NULL ); wglDeleteContext( hRC ); ReleaseDC( hWnd, hDC ); }
あとは、普通にOpenGL APIを使うだけでおk。
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); glClear( GL_COLOR_BUFFER_BIT ); glPushMatrix(); glBegin(GL_TRIANGLES); glVertex2f( 0.0, 0.5); glVertex2f(-0.5, -0.5); glVertex2f( 0.5, -0.5); glEnd(); glPopMatrix(); glFlush(); SwapBuffers( dc );
で、こう書くと三角形がウィンドウ内に表示されるはず。
OpenGLの初期状態は、カメラ座標原点で-Z方向に向いていて、プロジェクションその他もろもろも含めてビューポートに表示される範囲が+1~-1の範囲。ちなみに座標系は右手系( +X が右、+Yが上、+Zが手前 )。