OpenGLを使用したプログラミングについて解説します。
プリミティブの頂点を設定するときの、開始と終了を宣言します。
void glBegin( GLenum mode );glBegin function (Windows) | MSDN
void glEnd( void );
The glOrtho function multiplies the current matrix by an orthographic matrix.
void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far );
void gluCylinder( GLUquadricObj *qobj, GLdouble baseRadius, GLdouble topRadius, GLdouble height, GLint slices, GLint stacks );gluCylinder function (Windows) | MSDN
変換行列に透視変換の行列を乗じます。
void gluPerspective( GLdouble fovy, // カメラの画角 GLdouble aspect, // 画面のアスペクト比 GLdouble zNear, // 奥行き方向の範囲 GLdouble zFar // );
void gluLookAt( GLdouble eyex, // 視点の位置 GLdouble eyey, GLdouble eyez, GLdouble centerx, // 目標の位置 GLdouble centery, GLdouble centerz, GLdouble upx, // ウィンドウに表示される画像の「上」の方向 GLdouble upy, GLdouble upz );
デバッグ時だけエラーが出力されるようにするには、次のようなマクロを用意すると便利です。
#ifdef _DEBUG #define CHECK_OPENGL_ERROR(cmd)\ cmd;\ {\ GLenum error;\ if((error = glGetError()) != GL_NO_ERROR)\ {\ TRACE("%s:%d[%s] OpenGL Error. %s\n",\ __FILE__, __LINE__, #cmd, gluErrorString(error));\ }\ } #else #define CHECK_OPENGL_ERROR(cmd) cmd; #endifPerformance OpenGL: Platform Independent Techniques
関数 | 説明 |
---|---|
auxWireSphere | 球の描画 (ワイヤー) |
auxSolidSphere | 球 |
auxWireCube | 立方体 |
auxSolidCube |
Nate Robins - OpenGL - GLUT for Win32
ソリッド キューブを描画します。
void glutSolidCube(GLdouble size);
ワイヤーフレーム キューブを描画します。
void glutWireCube(GLdouble size);
OpenGLのピクセル フォーマットを設定します。
BOOL WINAPI SetPixelFormat( HDC hdc, int iPixelFormat, const PIXELFORMATDESCRIPTOR *ppfd );SetPixelFormat function (Windows) | MSDN
OpenGLでは3Dモデルを定義する標準的なフォーマットが定義されていないため、他で定義されているフォーマットを流用することになります。
DXFとは、CADで使用される標準的なファイル形式です。
Xファイルとは、DirectXでサポートされるファイル形式です。
OpenGLを、C#などの.NET言語から呼び出せるようにするラッパーです。
メタセコイアのオブジェクトを読み込めます。
HGLRC m_hRC; // void Init( const HDC &hDC ) throw(const DWORD) { // ピクセル フォーマットを初期化する InitPixelFormat( hDC ); // カラーパレットを設定する CreateRGBPalette( hDC ); // レンダリングコンテキストを生成する if( ( m_hRC = ::wglCreateContext( hDC ) ) == NULL ) throw GetLastError(); // レンダリングコンテキストをカレントにする if( !::wglMakeCurrent( hDC, m_hRC ) ) throw GetLastError(); ::glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); // 画面をクリアする色の設定 ::glClearDepth( 1.0f ); // Depthバッファの指定 ::glEnable( GL_DEPTH_TEST ); // デプステストを有効 // ::glEnable( GL_CULL_FACE ); // 片面表示を有効 ::glCullFace( GL_BACK ); // 裏面を非表示 ::glEnable( GL_LIGHTING ); // 陰影付けを有効 ::glEnable( GL_LIGHT0 ); // 光源を有効 ::glShadeModel( GL_SMOOTH ); // スムーズシェーディングモデル // ::glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); // ワイヤーフレームモデル // レンダリングコンテキストを解放する if( !::wglMakeCurrent( hDC, NULL ) ) throw GetLastError(); } // ピクセルフォーマットの初期化 void InitPixelFormat( const HDC &hDC ) throw(const DWORD) { // ウィンドウのピクセルフォーマットの設定 PIXELFORMATDESCRIPTOR pfd = { sizeof( PIXELFORMATDESCRIPTOR ), // 構造体のサイズ 1, // 構造体のバージョン番号 PFD_DRAW_TO_WINDOW // 特性フラグ(アプリケーションがメモリDCのビットマップに描画可能) | PFD_SUPPORT_OPENGL // (バッファがOpenGLをサポートする) | PFD_DOUBLEBUFFER, // (ダブルバッファを使う) PFD_TYPE_RGBA, // ピクセルのカラーデータ (RGBAモード) 24, // カラービット数 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, // デプスバッファのピクセル当りのビット数 0, 0, PFD_MAIN_PLANE, // レイヤタイプ (Win32ではPFD_MAIN_PLANE) 0, 0, 0, 0 }; // デバイス コンテキストに最も適合するピクセルフォーマットの選択 int pixelFormat = ::ChoosePixelFormat( hDC, &pfd ); if( !pixelFormat) throw GetLastError(); // これをデバイスコンテキストのピクセルフォーマットとする if( !::SetPixelFormat( hDC, pixelFormat, &pfd ) ) throw GetLastError(); } // カラーパレットの設定 void CreateRGBPalette( const HDC &hDC ) throw(const DWORD, OpenGLError) { // ピクセルフォーマットのインデックスの取得 int n = ::GetPixelFormat( hDC ); if(!n) throw GetLastError(); // ピクセルファーマットのリストの取得 PIXELFORMATDESCRIPTOR pfd; if( !::DescribePixelFormat( hDC, n, sizeof( PIXELFORMATDESCRIPTOR ), &pfd ) ) throw GetLastError(); if( pfd.dwFlags & PFD_NEED_PALETTE) throw InvalidDisplayMode; }