OpenGL講習 インデックスに戻る

内容

glutのAPIを利用してOpenGL用のウィンドウを作成し、その上にOpenGLのAPIで三角形を描画します。
この実習では、OpenGLを使っていますが、まだ3次元ではなく2次元上での描画を行います。

Sample01.jpg

ソースダウンロード

http://dl.getdropbox.com/u/235401/OpenGL/Sample01.zip

解説

準備

 
int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow )
{
	glutInitWindowPosition( 100, 50 );
	glutInitWindowSize( 200, 100 );
	glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB  );
 
	glutCreateWindow( "Sample01" );
	glutDisplayFunc( Render );
	glutMainLoop();
 
	return 0;
}
 

OpenGLを描画するためのウィンドウを、glutというライブラリを利用して簡単に作成・準備するコードです。

 
glutInitWindowPosition( 100, 50 );
glutInitWindowSize( 200, 100 );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB  );
 
glutCreateWindow( "Sample01" );
 

まず最初の2行で、ウィンドウの位置とサイズを決めます。
デスクトップ左上からX=100, Y=50ドットの位置(glutInitWindowPosition)に、横200, 縦100ドットの大きさ(glutInitWindowSize)のウィンドウとします。

その次にglutInitDisplayModeでディスプレイモードを指定していますが、これはこういうものと華麗にスルーしておいてください。

そしてglutCreateWindowでウィンドウタイトルを「Sample01」として準備しています。

ここまででウィンドウの下準備完了です。

 
glutDisplayFunc( Render );
 

ウィンドウ描画を行う関数を登録します。
ウィンドウの描画が行われるタイミングになったら、ここで登録するRender関数が呼ばれることになります。
このRender関数でどういう描画をするかを、自作アプリ内で記述してやることになります。
一般的にこういった○○の場合に××関数を呼ばせる、といった仕組みをコールバックといいます。

 
glutMainLoop();
 

この関数を呼ぶことで、ウィンドウが画面上に表示され、OpenGLの処理が開始されます。

余談ですが、本来WindowsAPIを使ってウィンドウを作成・表示しようと思うと、それだけでものすごく大量のコードを書く必要があります。
今回のコードでもそれなりの量になっているように見えて、これでもずいぶんシンプルなのです。glutさまさまですね。

描画

 
void Render()
{
	glClear( GL_COLOR_BUFFER_BIT );
 
	glBegin( GL_TRIANGLES );
	{
		glColor3ub( 0xFF, 0, 0 );
		glVertex2f( 0, 0 );
		glColor3f( 0, 0, 1 );
 		glVertex2f( -1, 0.9 );
 		glVertex2f( 1, 0.9 );
 	}
 	glEnd();
 
 	glutSwapBuffers();
}
 

以上の関数で三角形を1個描画しています。
詳細を追ってみましょう。

 
glClear( GL_COLOR_BUFFER_BIT );
 

描画用のバッファをクリアしています。
最初にこれをやっておかないと、前回描画したものがクリアされず上書きされ続けてしまいます。

 
glBegin( GL_TRIANGLES );
// 頂点指定...
glEnd();
 

glBegin~glEndまでの間に、描画したいポリゴンの頂点座標を次々指定します。
glBegin関数に渡している引数GL_TRIANGLESが、ここで描画するポリゴンは三角形ですよ、ということを意味しています。
この頂点指定(と色指定)については、下の項目でひも解いてみます。

 
glutSwapBuffers();
 

この関数を呼ぶことで、描画した内容が実際にウィンドウに表示されます。
さらに詳細に言うと「描画していたバックバッファをウィンドウバッファとスワップする」ということになるのですが、興味がある人は「ダブルバッファリング」とか「バックバッファ」といったキーワードで調べてみてください。

頂点指定

 
glBegin( GL_TRIANGLES );
{
	glColor3ub( 0xFF, 0, 0 );
	glVertex2f( 0, 0 );
	glColor3f( 0, 0, 1 );
	glVertex2f( -1, 0.9 );
	glVertex2f( 1, 0.9 );
}
glEnd();
 

glBegin~glEndに挟まれたここが今回のサンプルのキモ、三角形描画のための頂点指定を行っている個所です。

 
glVertex2f( 0, 0 );
 

このglVertex2fという関数で頂点の座標を指定しています。
ここで指定する座標はまだ2次元のためXとYの2つの値だけです。
ウィンドウの描画対象となっている領域(これを一般にクライアント領域といいます)内で、左上を(-1, 1)、右下を(1, -1)という風に決められています。
つまり数学で通常使うのと同じ、右上が正で左下が負となる座標系ですね。
上のコードだと、クライアント領域のちょうど中央に頂点を1個指定したことになります。
続いてあと2回のglVertex2f関数呼びだしにより、三角形1個分となる3頂点の指定を行っています。

 
glColor3ub( 0xFF, 0, 0 );
glColor3f( 0, 0, 1 );
 

さて、頂点指定に前後して上のような関数呼び出しがあるのですが、これは後続の頂点に対して色を指定する役割をもっています。
それぞれ引数を3つ持ち、1番目から赤・緑・青の明るさを指定することで色を作り出しています。
関数末尾がubかfかによって渡す引数が変わっており、ubの場合はunsigned char型、fの場合はfloat型で渡す必要があります。またubでは0~255の範囲、fでは0~1の範囲の値をとります。
上のコードだと、glColor3ubで赤、glColor3fで青になっていますね。

実は...

 
int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow )
{
	glutInit( argcp, argv );
 

glutを利用する場合、最初にglutInitという関数でglutライブラリの初期化を行うことになっているのですが、引数を加工するのが割と煩雑だったことと、なくても特に問題なく動いたことから省略しています。
もし何か問題が発生するようだったら、最初に呼ぶように追加してみてください。


添付ファイル: fileSample01.jpg 1401件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-10-24 (日) 17:14:24 (2586d)