Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
- 1 -
VisualStudio2010 を用いた
OpenGL(Glut)コンソール
アプリケーションの作成方法
初版: 2007.01.06 藤尾
改訂: 2010.08.24 秋山
- 2 -
- 目次 -
Ⅰ.プログラミングの準備 3
Ⅰ.1 はじめに 3
Ⅰ.2 OpenGL の環境設定 3
Ⅱ.プログラミングの第1歩(簡単なプログラムの作成) 3
Ⅱ.1 プロジェクトの作成と保存(空きの Win32 アプリケーションの作成) 3
Ⅱ.2 プロジェクトのオープンとプログラムのコンパイル(ビルド)と実行 4
Ⅱ.3 OpenGL 環境の設定の追加 5
Ⅲ.OpenGL の必要最低限の関数を設定する 6
Ⅳ. OpenGL プログラムの解説 7
Ⅳ.1 OpenGL プログラムの解説 7
- 3 -
Ⅰ.プログラミングの準備
Ⅰ.1 はじめに
皆さんが使っているパソコンには Windows やペイント,ワード,エクセルなど数多くのソフトウェアが入っています.パソコンは
これらのソフトウェアが無いとただの箱になってしまい,全く使うことができません.これらのソフトウェアはプログラム言語という
パソコンなどコンピュータを動かすために作られた専用の言語で作られています.つまりソフトウェアというのはプログラムの寄
せ集めであるといえます.コンピュータに仕事をさせるには,このプログラムによって仕事を指示してやる必要があるのです.プ
ログラムを作成する(プログラミングという)には,用いるプログラム言語の文法やデータ構造を理解しておく必要があります.
ここでは,C言語の基礎をある程度習得したプログラミング初心者を対象に,Windows上で動作するOpenGLのコンソールア
プルケーションソフトウェアのプロジェクトの作り方を解説します.ユーザはこのガイドで作成されたプロジェクトを基に,自らの
プログラムを追加記述してください.
なお,コンソールアプルケーションソフトウェアとは,一般的な Windows アプリケーションのようにメニューバーやダイアログに
よって操作するプログラムではなく,キーボードとマウスからのみデータの入力が可能で,出力は画面内のみのアプリケーショ
ンです.
Ⅰ.2 OpenGL の環境設定
必要なファイルのコピーと設定
OpneGL の glutを使うためには glut32.dll,glut32.lib, glut.h
が必要です.これらは,本来は VisualStudio の決まったフォルダに入れるべきです.一般に
glut32.dll は C:\WINDOWS\system32
glut32.lib は C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib
glut.h は C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\gl
に格納します.実際には使うパソコンにより異なる可能性があります.しかし,演習のため今回は作成したプロジェクトを保存す
るフォルダに保存します.また,これらのファイルは http://www.opengl.org/resources/libraries/glut.html から取得できます.
Ⅱ.簡単な OpenGL プログラムの作成
では最初に,まずはプログラムを書いてみましょう.使用するソフトウェアはマイクロソフトの VisualStudio 2010 です.作成する
プロジェクトは OpenGlut2DBase です.
Ⅱ.1 プロジェクトの作成と保存(空きの Win32 アプリケーションの作成)
(1)Visual Studio 2010 の起動
図Ⅰ-1のように「スタート」「すべてのプログラム」「Microsoft Visual Studio 2010」を選択して起動します.実際の画面はこの図
Ⅰ-1 とは違いますので注意してください.
(2)プロジェクトを作成
図Ⅱ-2のように「ファイル」「新規作成」「プロジェクト」を選択し,プロジェクトのダイアログを表示します.
図Ⅱ-3に示すように,ダイアログで「Win32 コンソールアプリケーション」を選択し,プロジェクト名を”OpenGlut2DBase”とします.
保存場所は,各自で決めて設定してください.保存場所は忘れないように注意してください.設定が終了したら「OK」をクリック
図Ⅱ-1 VisualStudio 2010 の起動
図Ⅱ-2 プロジェクトの新規作成
- 4 -
します.その後「完了」をクリックします.
(3)ビルド
図Ⅱ-4(a)のように「ビルド」「OpenGlut2DBaseのリビルド」を選択しビルドします.正常にビルドが終了すると出力ウインドウ(画
面下)に図Ⅱ-4(b)のようなメッセージが出ます.
(4)実行
図Ⅱ-5のように「デバック」「デバッグ開始」でプログラムを実行します.ツールバーの でも実行可能です.
一瞬黒い画面が出て元の画面に戻れば正常終了です.
(5)プロジェクトの終了
プログラミングが終わった際には,プロジェクトを閉じます.図Ⅱ-6 のように「ファイル」「ソリューションを閉じる」で,VisualStudio を
終了せず,プロジェクトのみ終了します.プログラムを終了したい場合は「ファイル」「終了」を選択します.ここでは一度,プロジェ
クトを終了しましょう.
Ⅱ.2 プロジェクトのオープンとプログラムのコンパイル(ビルド)と実行
(1)Visual Studio2010 の起動
「スタート」「すべてのプログラム」「Microsoft Visual Studio 2010」を選択して起動します.
(2)プロジェクトを開く
図Ⅱ-7のように「ファイル」「開く」「プロジェクト/ソリューション」を選択します.ファイルダイアログで以前に作成した
OpenGlut2DBase.sln を選択し「開く」をクリックします.
図Ⅱ-3 プロジェクトの設定
(a)ビルドメニュー (b)ビルド結果
図Ⅱ-4 プロジェクトのビルド
図Ⅱ-5 プロジェクトの実行
図Ⅱ-6 プロジェクトの終了
- 5 -
(3)ソリューションの破棄
他のフォルダからコピーした後にプロジェクトを開く際には,フォルダ情報等が更新されていませんので,ソリューション情報を
破棄し,再度ビルドする必要があります.以前使用したプロジェクトのフォルダと同じ場合にあるプロジェクトを開く際は,この手
続きは省略できます.
図Ⅱ-8のように「ビルド」「ソリューションのクリーン」を選択し,続けて「ビルド」「OpenGlut2DBaseのクリーン」を選択します.
(4)ソリューションのリビルド
その後,図Ⅱ-9の様に「ビルド」「ソリューションのリビルド」を選択します.エラーが発生していないことを確認します.
(5)実行
「デバッグ」「デバッグの開始」でプログラムを実行します.ツールバーの でも実行可能です.
(6)プロジェクトの終了
「ファイル」「ソリューションを閉じる」を選択します.
Ⅱ.3 OpenGL 環境の設定の追加
次に OpenGL がプログラムで使えるように設定を変更します.
(1)プロジェクトを開く
「ファイル」「開く」「プロジェクト/ソリューション」を選択します.ファイルダイアログで以前に作成した OpenGlut2DBase.sln を選
択し「開く」をクリックします.
(2)ライブラリの追加
OpenGL の glutを使えるようにするには glutに必要なファイルをプロジェクトに登録しなければなりません.
図Ⅱ-10 のように「プロジェクト」「OpenGlut2DBase のプロパティ」を選択します.図Ⅱ-11 に示すダイアログでリンカの入力を選
択し,opengl32.lib glu32.lib glut32.lib を入力します.その後「OK」をクリックします.この時,構成を「アクティブ(Debug)」から
「Release」にすると配布用のプログラムを作ることができます.
また,ここで glut を利用するに必要なファイルをプロジェクトのフォルダにコピーします.必要なファイルは glut32.dll glut32.lib
glut.h の 3 ファイルです.
(a)ソリューションを開くメニュー (b)ファイルダイアログ
図Ⅱ-7 プロジェクト(ソリューション)の読み込み
図Ⅱ-8 プロジェクト(ソリューション)の削除 図Ⅱ-9 プロジェクト(ソリューション)のビルド
図Ⅱ-10 プロジェクトのプロパティ 図Ⅱ-11 プロジェクト(ソリューション)への追加登録
- 6 -
(3)OpenGL ライブラリ用のインクルードを追加
ソースコードに
の 1 行を追加
(4)リビルド
図Ⅱ-12 のように「ビルド」「OpenGlut2DBaseのリビルド」を選択し,再構築します.
(5)実行
ビルドエラーもなくビルドできたら,実行してみてください.プログラムは相変わらず画面が一瞬出て終了するだけです.
(6)プロジェクトの終了
「ファイル」「ソリューションを閉じる」を選択します.
Ⅲ. OpenGL の必要最低限の関数を設定する
(1)ソースコードの追加
(2)コンパイルと実行
「ビルド」「OpenGlut2DBaseのビルド」を選択しビルドする
出力ウインドウに[ビルド:1正常終了,0 失敗,0 スキップ]がでれば完了
(3)実行
「デバッグ」「デバッグの開始」を選択し実行する.
図Ⅱ-12 プロジェクトのビルド
#include “glut.h”
旧スタイル #include <GL/gl.h>
#include <GL/glaux.h>
- 7 -
画面が二つ現れ次のような画面がでると正常に作成できたことになる.
(4)終了
<ESC>キーで終了
Ⅳ. OpenGL プログラムの解説
Ⅳ.1 OpenGL プログラムの解説
正常にビルドできた後,実行するとまだ処理内容は良くわかりませんが,画面には白い色をした四角形が描画されているはず
です.では,次にどのようにして四角形を書いているのか見ていきましょう.ソースコードは List Ⅳ-1に示してあります.
- 8 -
(1)インクルードファイル
初めて見るプログラムなので何がどうなっているかわからないと思いますので,順に説明していきます.
これはインクルードファイル(ヘッダーファイル)と呼ばれ,プログラムの中で使う必要な処理を使えるように設定する記述です.
単純にプログラムを書くためにはデフォルトでは”stdafx.h”だけで良いのですが,今回は描画に OpenGL を使っているため,
OpenGL が使えるように<GL/glut.h>”を書き加えます.
(2)関数とプログラムの流れ
C言語のプログラムは関数(ある処理の固まり)の集まりで表現されます.このプログラムでは “Initialize” と
“draw” ,”_tmain”の 3 つが関数です.C言語のプログラムは関数の中でも main(この場合_tmain)から始まると決まっています.
ですからプログラムは tmainから実行され始めます.実行が始まると_tmain関数の 1行目にある glutInit(&argc,argv); にプログ
ラムは進みます.
この形も実は関数で,関数の形は 関数名(引数) という形式になります.関数名が glutInit となっていますが,このように関数
名の最初に gl,glutが付く関数は OpenGL を使う際に決められている関数名です.他にも glutDisplayFunc,glutMainLoop など
も OpenGL を使う際に決められている関数で,決められた使い方の値を与える(これを引数という)ことで指定した動きをさせる
ことができます.この関数は OpenGL の初期化を行う関数で,この様に書くと覚えてください.
glutInitが終了すれば次の行の Initialize()にプログラムは進みます.この関数はプログラムの上に書いてあるので,プログラム
は Initialize()に移ります.Initialize では表示モードの設定や画面の設定を行います.Initialize の最後の行 glOrtho が終わると
また _tmain に戻り Initialize の次の行の glutDisplayFunc(draw) に進み,さらに glutMainLoopに進みます.この glutMaiLoop
では描画に必要が生じた際(プログラムが実行された場合や,画面が再度表示されるようになった場合)に引数として与えられ
た draw にプログラムを進めます.draw は描画する関数です,絵を描いた後再度 glutMainLoop に戻り,再描画を待ちます.プ
ログラムを終了させた時,glutMainLoop を終えて次の return に進みプログラムは終了します.
#include "stdafx.h"
#include <GL/gl.h>
#include <GL/glaux.h>
// ユーザの初期化
void Initialize(void)
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 表示モードの指定
glutInitWindowSize(500, 500); // 画面サイズの指定
glutInitWindowPosition(100, 100); // ウインドウ位置の指定
glutCreateWindow("OpenGL Win32 2D Base Program"); // ウインドウの作成とタイトル設定
glClearColor(0.0, 0.0, 0.0, 1.0); // ウインドウの背景色の設定
glOrtho(-500/2, 500/2, -500/2, 500/2, -1, 1); // 平行投影
}
// 描画関数
void draw(void)
{
// 原点から長さ200の四角形を描画する
glClear(GL_COLOR_BUFFER_BIT); // 画面のクリア
glBegin(GL_LINES); // 直線を書く
glColor3d(1.0,1.0,1.0); // 線の色を白色にする
glVertex2d( 0.0, 0.0); glVertex2d(200.0, 0.0); // 直線の描画
glVertex2d(200.0, 0.0); glVertex2d(200.0, 200.0); // 直線の描画
glVertex2d(200.0, 200.0); glVertex2d( 0.0, 200.0); // 直線の描画
glVertex2d( 0.0, 200.0); glVertex2d( 0.0, 0.0); // 直線の描画
glEnd(); // 直線データの終了
glFlush(); // 描画処理実行
}
int _tmain(int argc, _TCHAR* argv[])
{
glutInit(&argc,argv); // GLUTの初期化
Initialize(); // ユーザの初期化関数
glutDisplayFunc(draw); // 描画関数の指定
glutMainLoop(); // GLUTのメインループ
return 0;
}
#include "stdafx.h"
#include <GL/glut.h> List Ⅳ-2
List Ⅳ-1
- 9 -
プログラムの流れ
int
return
_tmain(int argc, _TCHAR* argv[]){
glutInit(&argc,argv);Initialize();glutDisplayFunc(draw);glutMainLoop();
0;}
// ユーザの初期化void void Initialize( ){
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(500, 500);glutInitWindowPosition(100, 100);glutCreateWindow("OpenGL Win32 2D Base Program");glClearColor(0.0, 0.0, 0.0, 1.0);glViewport(0,0,500,500);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-500/2, 500/2, -500/2, 500/2, -1, 1);
}
// 描画関数
// 原点から長さ200の四角形を描画する
void void draw( ){
glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_LINES); glColor3d(1.0,1.0,1.0)
; glVertex2d( 0.0, 0.0); glVertex2d(200.0, 0.0); glVertex2d(200.0, 0.0); glVertex2d(200.0, 200.0); glVertex2d(200.0, 200.0); glVertex2d( 0.0, 200.0); glVertex2d( 0.0, 200.0); glVertex2d( 0.0, 0.0);glEnd();glFlush();
}
START
END
(3)メイン関数
メイン関数はプログラム全体を統括するプログラムです.処理はメインプログラムに始まりメインプログラムで終わります.
手順は上の行から下の行へ実行していきます.各関数の処理内容は次のようになっています.
・glutInit(&argc, argv)
この関数は,今回グラフを書くために利用する OpenGL が利用できるようにするための処理(関数)です.これを呼ぶ(実行
する)ことにより,以降で線や点を書くことが可能になります.
・Initialize();
この関数はプログラムの上の方に記述されている関数でプログラマ(プログラムを書く人,つまりあなた)が記述する関数です.
この中では,画面サイズの設定やウインドウ(処理を行うための画面)の作成と表示を行います.
・glutDisplayFunc(draw)
この関数は,他のウインドウの裏に隠れていた画面が表に現れる時や,描画するデータに変更があって描画する際(再描画
といいます)に,描画を行う関数を定義します.この例では,再描画時に draw という関数を使うということを指示しています.
・glutMainLoop();
この関数は,OpenGL のウインドウが閉じられるまで繰り返す関数です.処理の内容はキーボードやマウスなどユーザ(プロ
グラムを使っている人)が何か操作を行っていないか監視しています.そして,押されたキーボードやマウス操作(イベント)
に応じた処理,つまり関数(ハンドラ)を呼び出します.
・return 0;
ウインドウが閉じられて glutMainLoopを終えた後実行される処理で,処理を終了してWindowsに 0を返し,処理を完全に終
了します.
(4)Initialize 関数
この関数はユーザが描画を行うために必要な処理を実行します.内部では6個の関数を呼び出しています.全ての関数に gl
または glut が付いていますので,全て OpenGL に対する設定をしていることがわかります.では各処理内容を見ていきましょう.
表示される画面の位置や名前は図Ⅳ-2に示すようになっています.
・glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
// ユーザの初期化
void Initialize(void)
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 表示モードの指定
glutInitWindowSize(500, 500); // 画面サイズの指定
glutInitWindowPosition(100, 100); // ウインドウ位置の指定
glutCreateWindow("OpenGL Win32 2D Base Program"); // ウインドウの作成とタイトル設定
glClearColor(0.0, 0.0, 0.0, 1.0); // ウインドウの背景色の設定
glOrtho(-500/2, 500/2, -500/2, 500/2, -1, 1); // 平行投影
}
glutInit(&argc,argv); // GLUTの初期化
Initialize(); // ユーザの初期化関数
glutDisplayFunc(draw); // 描画関数の指定
glutMainLoop(); // GLUTのメインループ
return 0;
画面が隠れたりする毎にこの関数だけ繰
り返し実行される
図Ⅳ-1 プログラムの流れ
List Ⅳ-3
List Ⅳ-4
- 10 -
これは表示の状態を設定しています.ここで使われる引数の意味は,単一画面で RGB(赤緑青で光の三原色といわれます)
を使うことを定義しています.
・glutInitWindowSize(500,500);
この関数はユーザが使うための描画画面サイズを設定します.この例では横 500(ひとつめの引数),縦 500(二つめの引
数)を表しています.
・glutInitWindowPosition(100,100);
この関数は描画ウインドウの位置を指定します.この例では画面の左上(ディスプレイ原点)から右横方向に100(ひとつめの
引数),下方向に 100(二つめの引数)の位置に描画ウインドウの左上を配置します.
・glutCreateWindow(“OpenGL Win32 2DBase Program”);
この関数は実際に画面を作成し(描画ウインドウとコンソールウインドウ),描画画面のタイトルバーに引数である文字列
OpenGL Win32 2DBase Program (アプリケーションタイトル)を書き込みます.
・glClearColor(0.0, 0.0, 0.0, 1.0);
この関数は画面を消去(描画されていた画像をクリア)した時の色を指定します.最初の3個の引数が色を表します.それぞ
れ順に R,G,B を意味しています.全て ZERO の場合は黒,全て 1.0 の場合は白を意味します.また,R を 1.0 にして,それ
以外を ZERO にした場合は赤色となります.
・glOrtho( -500/2, 500/2, -500, 500/2 , -1, 1);
ユーザが設定している座標(ワールド座標)からカメラを用いて描画したい部分を設定します.この例では原点(0,0)から長
さ 200の正方形を書いていますので,ワールド座標では図Ⅳ-3(a)に示すような形と座標を持ちます.それら全体を描画でき
るように図Ⅳ-3(b)に示すようにワールド座標上の(-250,-250)から(250,250)の四角を描画ウインドウに書き出します.画面の
長さは上で設定した描画画面サイズの 500 を用いたので,その半分の 250 を使っています.この結果,描画ウインドウはワ
ールド座標原点を中心とした座標形を持ち四角形は図Ⅳ-3(c)に示すように描画されます.
この関数を省略するとデフォルトでワールド座標上の(-1,-1)から(1,1)の四角を描画ウインドウ(正規デバイス座標系)に書
き出します.3次元で考える場合は,奥行き(Z座標)も考えなければならず,視点(カメラの位置と方向)を決めてスクリーン
に投影します.この時,デフォルトでは視点はワールド座標の原点でZ軸の反対を向いています.視点の先がプラスで,視
点の後ろがマイナスとなります.この例では,2次元の立体は Z 軸が ZERO の位置にありますので,-1 と 1 を設定します.投
影には2種類あり,今回のように視点から平行に投影する手法を平行投影といいます.この投影法では遠近感を出す事が
できませんので一般的にはCADなど2次元を表現する際に用いられます.このように設定されてできる四角柱の空間を視
体積(ビューボリューム)と呼び,この中にない図形は描画されません.
図Ⅳ-2 画面名称 タイトルバー
アプリケーションタイトル (100,100)描画ウインドウ位置
(0, 0)ディスプレイ原点
描画ウインドウ
コンソールウインドウ
- 11 -
( , )0 0 ( , )200 0
( , )200 200( , )0 200
X
Y
( , )0 0 ( , )200 0
( , )200 200( , )0 200
X
Y
(- , - )250 250
( , )250 250OpenGL Win32 2D Base Program
( , )0 0
( , )1 0 X
Y
(- , - )1 1
( , )1 1
( , )0 1
( , )まで線はある0 200
( , )まで線はある200 0
OpenGL Win32 2D Base Prog ram
X
Y
カメラの向き
far
near
( , , )left bottom near
カメラ
Z
ワールド座標
( , , )right top far
top
left
bottomright
スクリーン
視体積
(5)draw 関数
この関数は実際に図形を描く処理です.この関数内で呼ばれる関数も全て頭に gl が付いていますので,OpenGL の処理関
数であることがわかります.処理の流れは画面をクリアした後,線分を描き,描画命令を実行しています.では具体的に追って
いきましょう.
・glClear(GL_COLOR_BUFFER_BIT);
画面を指定された色でクリアします.色の設定は glClearColor で設定された色を利用します.
・glBegin(GL_LINES);
// 描画関数
void draw(void)
{
// 原点から長さ200の四角形を描画する
glClear(GL_COLOR_BUFFER_BIT); // 画面のクリア
glBegin(GL_LINES); // 直線を書く
glColor3d(1.0,1.0,1.0); // 線の色を白色にする
glVertex2d( 0.0, 0.0); glVertex2d(200.0, 0.0); // 直線の描画
glVertex2d(200.0, 0.0); glVertex2d(200.0, 200.0); // 直線の描画
glVertex2d(200.0, 200.0); glVertex2d( 0.0, 200.0); // 直線の描画
glVertex2d( 0.0, 200.0); glVertex2d( 0.0, 0.0); // 直線の描画
glEnd(); // 直線データの終了
glFlush(); // 描画処理実行
}
(a)ワールド座標 (b)ビュー座標 (c)実際の画面
図Ⅳ-3 画面の座標系の設定 「glOrtho( -500/2, 500/2, -500, 500/2 , -1, 1)」
(a)ワールド座標 (b)実際の画面
図Ⅳ-4 デフォルトの座標系
図Ⅳ-5 平行投影 「glOrtho( -500/2, 500/2, -500, 500/2 , -1, 1)」
List Ⅳ-5
- 12 -
引数で指定された図形を描くことを宣言します.この宣言は glEnd が来るまで有効です.言い換えれば glBegin から glEnd
でひとつの図形のかたまりを描画することを示しています.
・glColor3d(1.0, 1.0, 1.0);
描画する線の色を指定しています.引数は順に R,G,B を表しており,各値の最大値は 1.0 です.ここでは RGB 全てに 1.0
が設定されているので白色を使うと宣言していることになります.
・glVertex2d(0.0, 0.0); glVertex(200.0, 0.0);
この二つの関数で(0.0, 0.0)から(200.0, 0.0)まで線を描くことを意味しています.つまり2点を指定するとそれがひとつの線分
となります.4本の線を描く場合はこの関数を 4 組8個使うことになります.
・glEnd();
glBeginで指定された描画対象形状の指定終了を意味します.描画できる対象形状はGL_LINESの他にも様々な物がありま
す.
GL POINTS_
V0
V1
V2
V3
V4
GL LINES_
V0
V1
V2
V3
GL LINE STRIP_ _
V0
V1
V2
V3
V4
GL LINE LOOP_ _
V0
V1
V2
V3
V4
GL POLYGON_
V0
V1
V2
V3
V4
GL TRIANGLE FAN_ _
V0
V1
V2
V3
V4
GL TRIANGLE STRIP_ _
V0
V1
V2
V3
V4
V5
GL QUADS_
V0
V1
V2
V3
V4
V5
V6
V7
GL TRIANGLES_
V0
V1
V2
V3
V4
V5
GL QUAD STRIP_ _
V0
V1
V2
V3 V4
V5
V6
V7
(6)コメント
プログラムの中で // を用いると,その後から行の最後までがコメントとなりプログラムとして認識されません.また任意の位置
で /* から */ の間もコメント見なされます.これを使うと複数行まとめてコメントとすることができます.ただし, /* から */ の
間に /* と */ は入れることができません.コンパイル(ビルド)時にエラーとなります.
図Ⅳ-6 OpenGL の基本図形