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;
#endif
Performance 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; }