TOP

ABOUT

PROGRAM

DIALY







C#でOpenGL

 1.はじめに…
 C#でOpenGLいじってみました。




 2.C#でOpenGL
 最近の自分は,C#とJavaを使うことが多くなってきました。たまにC++に戻ると,プロパティが使いたいなぁ〜とか,文字列の取扱が面倒だなぁ〜と思うことが多いです。C++からC#に移ろうかなと本格的に思ってきたので,C#でOpenGLを使ってみます。
 自分で,ラッパーを作るのもいいんですが…,正直面倒です。
 そんなわけで,Tao Frameworkを使っていくことにしてみました。CgやらSDLやらGLFWやら色々と入っていて,使いやすそうなんでチョイスしてみました。


3. Tao Frameworkを用意する
 まずは,Tao Frameworkをダウンロードしましょう。http://www.taoframework.com/にアクセスします。
 すると,画面上部のメニューにDownloadという項目があるので,クリックします。
 ページが切り替わると,URLが書いてあるので,クリックします。



すると,再びページが移動します。移動すると下のような画面が出てくると思うので,Downloadをクリックします。



すると,またまたページが変わると思うので,Downloadをクリックします。
ページが変わると,いくつかのダウンロード形式が出てくるので,exe形式のものをダウンロードします。



ダウンロードが完了したら,ダウンロードした「taoframework-(ダウンロードしたバージョン)-setup.exe」をクリックします。このとき,注意してほしいのは,古いバージョンが既にインストールされている場合は,古いバージョンをアンインストールする必要があることです。
exeファイルをクリックすると,セットアップ画面が出てくるので,画面に従ってセットアップします。設定は基本デフォルトのままで良いと思います。



後は,プログラムを実行するのにDLLが必要になります。C:\Program Files\TaoFramework\libの中にDLLが入っています。いちいちプログラムと同じディクレトリに入れるのが面倒くさくて嫌なので,自分は,libファイルの中にあるDLLファイルをC:\Windows\System32にコピーしました。
 これで,一応Tao Frameworkの準備が完了したはずです。


4. コードを組む
 いよいよC#を立ち上げて,プログラムを組んでみます。
まずはVisual Studioを起動して,メニューから「ファイル→新規作成→プロジェクト」を選択します。「新しいプロジェクト」というダイアログがでてくるので,左側の「プロジェクトの種類」から「Visual C#→Windows」を選択。Visual Studioにインストールされたテンプレートの項目の中から「空のプロジェクト」を選択します。選択したらプロジェクト名を入力して,OKボタンを押します。



次に,ソリューションエクスプローラーで作成したプロジェクトを右クリックし,「追加→新しい項目」を選択します。すると,「新しい項目の追加」というダイアログが出てくるので,「コードファイル」を選択し,ファイル名を指定して,追加ボタンを押します。これで,コードファイルが追加できました。
 空のプロジェクトを作成したので,アプリケーションの種類がデフォルトではコンソールアプリケーションになっているので,Windowsアプリケーションに変更します。
 ソリューションエクスプローラーで,作成したプロジェクトを右クリックし,「プロパティ」を選択します。すると,下のような画面が出てくると思います。



 「アプリケーションの種類」という欄があるので,「Windowsアプリケーション」に変更します。これでWindowsアプリケーションが作成できます。
あとは,参照設定を設定します。ソリューションエクスプローラーで,参照設定を右クリック。「参照の追加」を選択します。下のような,ダイアログが出てくると思います。



ダイアログの「.NET」のタブを選択して,上の画像のように以下の3つの参照を追加します。
・System
・Tao Framework OpenGL Binding For .NET
・Tao Framework FreeGLUT Binding For .NET
追加すると,ソリューションエクスプローラーが下のようになると思います。




これで,設定が完了です。ようやくコードを打ち込む準備が整いました。
C#使っていれば,GLUTなんて必要ないんですが…,まぁ〜慣れているのでGLUTを使っていくことにします。
簡単なコードということで,下のコードを打ち込んで,ビルドしてみてください。
00011:  #region Using Statements
00012:  //
00013:  // Using Statements
00014:  //
00015:  using System;
00016:  using Tao.FreeGlut;
00017:  using Tao.OpenGl;
00018:  #endregion
00019:  
00020:  
00021:  public class SampleProgram
00022:  {
00023:  	#region Fields
00024:  	//
00025:  	// Fields
00026:  	//
00027:  
00028:  	private static int width = 800;
00029:  	private static int height = 600;
00030:  
00031:  	#endregion
00032:  
00033:  	/// <summary>
00034:  	/// エントリーポイント
00035:  	/// </summary>
00036:  	/// <param name="args">コマンドライン引数</param>
00037:  	public static void Main( string[] args )
00038:  	{
00039:  		Run();
00040:  	}
00041:  
00042:  	[STAThread]
00043:  	public static void Run()
00044:  	{
00045:  		Glut.glutInit();
00046:  		Glut.glutInitWindowSize(width, height);
00047:  		Glut.glutInitDisplayMode(Glut.GLUT_DEPTH | Glut.GLUT_DOUBLE | Glut.GLUT_RGB);
00048:  		Glut.glutInitWindowPosition(50, 50);
00049:  		Glut.glutCreateWindow("サンプルプログラム");
00050:  
00051:  		Glut.glutDisplayFunc(new Glut.DisplayCallback(DisplayFunc));
00052:  		Glut.glutKeyboardFunc(new Glut.KeyboardCallback(KeyboardFunc));
00053:  		Glut.glutMouseFunc(new Glut.MouseCallback(MouseFunc));
00054:  		Glut.glutReshapeFunc(new Glut.ReshapeCallback(ReshapeFunc));
00055:  
00056:  		Initialize();
00057:  
00058:  		Glut.glutMainLoop();
00059:  	}
00060:  
00061:  	/// <summary>
00062:  	/// 初期化処理
00063:  	/// </summary>
00064:  	private static void Initialize()
00065:  	{
00066:  		Gl.glClearColor(0.3f, 0.3f, 1.0f, 1.0f);
00067:  		Gl.glEnable(Gl.GL_DEPTH_TEST);
00068:  		Gl.glDepthFunc(Gl.GL_LEQUAL);
00069:  
00070:  		Gl.glShadeModel(Gl.GL_SMOOTH);
00071:  	}
00072:  
00073:  	/// <summary>
00074:  	/// ウィンドウに描画
00075:  	/// </summary>
00076:  	private static void DisplayFunc()
00077:  	{
00078:  		//バッファをクリア
00079:  		Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
00080:  
00081:  		//モデルビュー行列の設定
00082:  		Gl.glMatrixMode(Gl.GL_MODELVIEW);
00083:  		Gl.glLoadIdentity();
00084:  
00085:  		//三角形を描画
00086:  		Gl.glColor3b(255, 125, 0);
00087:  		Gl.glBegin(Gl.GL_TRIANGLES);
00088:  		Gl.glVertex3d(-0.5f, -0.5f, 0.0f);
00089:  		Gl.glVertex3d(0.0f, 0.5f, 0.0f);
00090:  		Gl.glVertex3d(0.5f, -0.5f, 0.0f);
00091:  		Gl.glEnd();
00092:  
00093:  		//ダブルバッファリング
00094:  		Glut.glutSwapBuffers();
00095:  	}
00096:  
00097:  	/// <summary>
00098:  	/// ウィンドウのサイズ変更処理
00099:  	/// </summary>
00100:  	/// <param name="w">ウィンドウの幅</param>
00101:  	/// <param name="h">ウィンドウの高さ</param>
00102:  	private static void ReshapeFunc(int w, int h)
00103:  	{
00104:  		width = (w > 1 ? w : 1);
00105:  		height = (h > 1 ? h : 1);
00106:  		Gl.glViewport(0, 0, width, height);
00107:  
00108:  		Gl.glMatrixMode(Gl.GL_PROJECTION);
00109:  		Gl.glLoadIdentity();
00110:  	}
00111:  
00112:  	/// <summary>
00113:  	/// マウスの入力処理
00114:  	/// </summary>
00115:  	/// <param name="button">マウスのボタン</param>
00116:  	/// <param name="state">ボタンの状態</param>
00117:  	/// <param name="x">マウスカーソルのx座標値</param>
00118:  	/// <param name="y">マウスカーソルのy座標値</param>
00119:  	private static void MouseFunc(int button, int state, int x, int y)
00120:  	{
00121:  	}
00122:  
00123:  	/// <summary>
00124:  	/// キーボードが押された時の処理
00125:  	/// </summary>
00126:  	/// <param name="key">押されたキー</param>
00127:  	/// <param name="x">マウスカーソルのx座標値</param>
00128:  	/// <param name="y">マウスカーソルのy座標値</param>
00129:  	private static void KeyboardFunc(byte key, int x, int y)
00130:  	{
00131:  		switch ( key )
00132:  		{
00133:  			case 27:
00134:  				Environment.Exit(0);
00135:  				break;
00136:  		}
00137:  	}
00138:  }

書き方のお作法が若干違うだけで,やっていることは理解できると思います。普通に画面をクリアして,三角形を書いているだけです。
とりあえず,C#でOpenGLをいじってみました。もともとC#の使い方がよく分かっていなかったので,ずっとやらなかったんですが,最近少しずつ分かるようになってきたので,C#をメインにプログラムを書いていこうかなって思います。


 Download
本ソースコードおよびプログラムを使用したことによる如何なる損害も製作者は責任を負いません。
本ソースコードおよびプログラムは自己責任でご使用ください。
プログラムの作成にはMicrosoft Visual Studio 2008 SP1 Professional, Tao Framework 2.1.0を用いています。