GLSharp - C# OpenGL Wrapper + class library

GLSharp - C# OpenGL class library

(2012.10.15 更新) ver. 5.4.3 - OpenTK 1.0

C#で書かれたOpenGL用のクラスライブラリです。
一歩二歩散歩なりに作ってみました。
フリーソフトとしてここで公開しています。

OpenGLのラッパーとして
OpenTKというフリーのライブラリを使用しています。

GLSharpのメインは、
クラスライブラリの部分です。
これは、OpenGLプログラミングを簡単にするためのもので、
初期化(レンダリングコンテキストの作成)や、テクスチャの作成がサクッとできたり、
カメラやライト、マテリアルを表すクラス、文字列描画など、
いろいろあります。
だいぶコードを書く手間が省けるし、お手軽に扱えるようになるはずです。

また、MQO(Metasequoia Object)ローダーも実装しています。
(曲面に未対応など、まだ機能が十分でない点もありますが・・・。)
Metasequoiaという3Dモデリングソフトがありまして、
フリーソフトでありながら高機能、かつ初心者でも扱いやすいという、
なかなかの優れモノがあるのです。
(それゆえ、ユーザーも結構多いようです。)
GLShrarpでは、このMetasequoiaで作成したモデルデータ(.mqoファイル)を読み込んで、
OpenGLで描画することが可能です。
ついでに、MQO形式での書き出しもできたりします。


GLSharpの主なクラスは以下のようになっています。

public static class wgl
WGLのラッパークラス。
 
public class GLSControl : UserControl, IGLRenderingControl
OpenGLで描画を行うコントロール。
(OpenTKにも「GLControl」というのがありますが、それとは別物です。)
OpenGLの初期化はコントロールが勝手にやってくれます。
デザイナからピクセルフォーマットが指定できたりします。
また、RenderingSceneというScene型のプロパティを持ち、ここにセットされたOpenGLシーンを描画します。
 
public class GLSFrom : Form, IGLRenderingControl
OpenGLで描画を行うフォーム。
基本的に、機能はGLSControlとほぼ同等。
フルスクリーンモード機能を持っています。
 
public interface IGLRenderingControl
OpenGLで描画を行うコントロールを表します。
GLSControl、GLSFromで実装されるOpenGLに関する機能(レンダリングコンテキストの取得など)を定義しており、
両者を同じように扱えるようになっています。
 
public class RenderingContext
OpenGLのレンダリングコンテキストを扱うためのクラス。
初期化の手間をかなり省くことができる。
引数にコントロールを指定するだけで、
そのコントロールに対して描画するためのレンダリングコンテキストを作成できる。
アンチエイリアスなどのエクステンションにも対応しました。
 
public abstruct class Scene
OpenGLシーンを表す抽象クラス。
このクラスから派生クラスを作成し、
GLSControlまたはGLSFromのRenderingSceneプロパティにセットすると、
コントロール(またはフォーム)のほうで自動的に描画してくれます。
 
public class FpsController
Sceneオブジェクトのフレームレート(FPS)をコントロールするクラス。
 
public class Material
マテリアルを扱うクラス。
環境光(Ambient)、拡散光(Diffuse)、反射光(Specular)、自己照明(Emission)、反射強度(Shiness)、テクスチャ(Texture2D)
これらをまとめて扱える。
このクラスを使えば、ライティングを使用する際に、マテリアルの各要素+テクスチャをまとめて指定できる。
 
public class Textur2D
テクスチャを扱うクラス。
Bitmapクラスから自動的にテクスチャを生成してくれる。
ミップマップ、テクスチャ変換行列、テクスチャ座標自動生成にも対応。
 
public class DisplayList
ディスプレイリストを扱うためのクラス。
 
public class Camera
カメラ(視点)を表すクラス。
OpenGLでの、視点の移動や回転などを請け負う。
簡単なプロジェクション(射影変換)行列の操作もできる。
 
public class Light
ライト(光源)を表すクラス。
環境光(Ambient)、拡散光(Diffuse)、反射光(Specular)、光源の種類(点光源とか、指向性の光源とか、スポットライトとか。)
などをまとめて扱うことができる。
 
public class Mesh
3Dモデルのメッシュを表すクラス。
頂点、マテリアル、プリミティブなどを持つ。
メッシュの描画、法線の作成なども行える。
 
public class Model
OpnenGLで、描画するものをひとまとまりの「モデル」単位として扱うためのクラス。
抽象クラスなので、継承して使う。 親オブジェクトや子オブジェクトを持たせることができ、
階層構造をつくることが可能。
 
public class MeshModel : Model
メッシュデータを保持・描画するすクラス。
このクラスを使ってMetasequoiaのMQOファイル(*.mqo)の入出力も行うことができる。
Metasequoia ver. 2.4 の階層構造とローカル座標にも対応。
 
public class TextModel : MeshModel
アウトラインフォントの文字列をメッシュ化し、それらを扱うクラス。
簡単なテキストのレイアウトも設定できる。
MeshModel クラスを継承しているので、
MQOファイルに文字オブジェクトとして書き出すことも可能。
 
public class Selection
マウスピッキングをサポートするクラス。
モデル(Modelクラスのインスタンス)単位でのマウスピッキングを簡単に行うことができる。
 
public class BitmapCharGlyph : IGlyph
public class PolygonCharGlyph : IGlyph
public class TextureCharGlyph : IGlyph
れぞれ、ビットマップ、ポリゴン、テクスチャで文字を描画するグリフを表す。
 
public class BitmapGlyphDictionary : GlyphDictionary
public class PolygonGlyphDictionary : GlyphDictionary
public class TextureGlyphDictionary : GlyphDictionary
それぞれ、ビットマップ、ポリゴン、テクスチャで文字を描画するグリフオブジェクトを作成・管理するクラス。
同一グリフの多重作成を避けることができる。
 
public class BitmapTextLabel : TextLabel
public class PolygonTextLabel : TextLabel
public class TextureTextLabel : TextLabel
それぞれ、ビットマップ、ポリゴン、テクスチャでテキストを描画するクラス。
テキストの簡単なレイアウト指定(右揃えとか、中央揃えとか、その程度)も可能。
 
public class Position
位置座標と回転行列を扱うクラス。
ワールド座標系の位置座標と回転行列、ローカル座標系の位置座標と回転行列を持つ。
もっぱら、描画オブジェクトの位置や回転を管理・指定するためのクラス。
 
public class Primitive
プリミティブを表すクラス。
頂点インデックス、面法線ベクトル、各頂点のUV座標、マテリアル、頂点カラーを持つ。
 
public class Tessellator
GLUを利用してテセレーションを行うクラス。
輪郭線(Contourクラス)から、テセレーションによりメッシュを作成できる。
 
public class Contour
輪郭を表す頂点群を持つクラス。
Tessellatorクラスでテセレーションに用いる輪郭線。
 
public static class OutlineFontTessellator
アウトラインフォントの文字をポリゴン(メッシュ)化するクラス。
 
public class QuadricObject
public abstruct class Quadric
public class Sphere : Quadric
public class Cylinder : Quadric
public class Disc : Quadric
public class PartialDisc : Quadric
GLUの2次曲面オブジェクトを表すクラス。
球、円柱、円盤、扇形がある。
 
public static class Capture
OpenGLのバッファをキャプチャして、Bitmapクラスに変換するためのクラス。
描画したものを画像ファイルとして保存したりするのに便利。
 
public static class Vector
ベクトル演算のための静的クラス。
 
public static class Matrix
行列演算のための静的クラス。
 
public class Joystic
ジョイスティック(ゲームパッド含む)を扱うクラス。
 

GLSharpの配布形式は基本的にソースコードなのですが、
OpenGLラッパーとして使用しているOpenTKのソースコード量がなかなか多いので、
OpenTKはビルド済みのDLL(OpenTK.dll)のみを含めてあります。
(ソースコードはOpenTKのサイトで入手してください。)
それゆえ、
「OpenGLラッパーDLL」+「その他のクラスライブラリのソースコード」
というやや変則的な構成になってます。

サンプルプログラムもセットになっていて、こんな感じになってます。

テキスト描画のサンプル

MQOローダーのサンプル

アニメーションのサンプル

GLUの2次曲面オブジェクトのサンプル

一応チェックはしてるのですが、
所詮は個人の制作物ですから
ひょっとしなくてもバグがあると思われます。
そんなものを見つけたときは、ブログのコメントあたりでご一報いただけると、非常にありがたいです。
また、その他、改善してほしい点などがあったら、同様にどうぞ。


<ダウンロード>

では、ダウンロードはこちらから、どうぞ。
(※ Visual Studio 2010 のソリューションをZIPしてあります。
Visual C# 2010 Express でも使用できます。)

GLSharp5-4-3_OpenTK1-0.zip

ビルド済みのサンプルのプログラムも上げときます。 ビルドするのめんどくさいとか、とりあえずサンプルを動かしてみたいという方は、こちらをどーぞ。

GLSharp5-4-3_demo-bin.zip

こっちは古い方です。
GLSharp5_3_1.zip
GLSharp5_1_0.zip
GLSharp_4001.zip




一応書いておきますが。
著作権うんぬんについては、堅いことをあれこれ言うつもりはありませんので(著作権を放棄するわけではありません)
そのまんま売り物にしたり(売れるようなモノなのか?)とか、あんまり変なことをしない限り、
個人、商用、食用、流用、転用、コピペ、改変、改造、どうぞ、ご自由にお使い下さい。
ただし、損害等の保証はいっさいできません。食べられません。

もし、こんなの使いましたよー、と著作表示して頂いたり、
誰だか知らないけど制作者さんありがたく使わせてもらいますよー、とかちょっと思ったり
してもらえれば、幸いです。


OpenTKについて

The Open Toolkit Library
http://www.opentk.com/

GLSharpでは、冒頭でも述べたように、OpenTKを使用しています。
OpenTKについての詳細は、上記のサイトを参照してください。


Yanesdk.NETについて

一部、YaneuraoGameSDK.NET(通称Yanesdk.NET)
という、.NET用のライブラリからソースコードを使用させていただきました。
(アニメーションのフレームレートを制御する「FPSTimer」クラス。
だいぶ変更が加えてありますが。)

YaneSDKに付いての詳細は、
YaneSDKのホームページ
http://yanesdkdotnet.sourceforge.jp/
を参照してください。


わりと適当な更新履歴>

(2012.10.15)
ver. 5.4.3 - OpenTK 1.0
今更ですが、アップしているファイル内の、ビルド済みの"GLSharp.dll"に不具合があることが判明したので修正。
なんかうかく動かない、と思っていた方、申し訳ないです。
ついでに、使用するOpenTKを、ver.1.0のリリース版に変更。
GLSharp自体のソースはそのままです。

(2010.09.25)
ver. 5.4.3 - OpenTK Beta 2
レンダリングコンテキスト作成時に発生することがあるバグの修正。

(2010.04.25)
ver. 5.4.2 - OpenTK Beta 2
・OpenGLのバージョン取得時にエラーになるのを修正。
→実行環境に依存するバグなのですが、
以前のバージョンでデモがうまく動かなかった人は動くようになるかもしれません。
・テクスチャで描画する文字にアンチエイリアスを指定しても無視されてしまうバグを修正。

(2010.03.17)
ver. 5.4.1 - OpenTK Beta 2
文字列描画関連のクラスで、
GDIフォントオブジェクトがリークしていたのを修正。

(2010.02.28)
ver. 5.4.0 - OpenTK 1.0 Beta 2
文字列描画関連のクラスを再設計。
-> 文字に色をつけられる機能を追加。
FPSTimerを改善。
-> FPSの制御を改善。前よりもだいぶマシになったのではないかと。

(2009.12.14)
ver. 5.3.1 - OpenTK 1.0 Beta 2
RenderingContextクラスと、PixelFormatAttributeクラスを修正。

(2009.12.10)
ver. 5.3.0 - OpenTK 1.0 Beta 2
Sceneクラスを再設計。 -> AnimationSceneクラスの廃止、FrameControllerクラスの追加、など。
MQOファイルのバイナリ頂点データ、ミラーに対応。
MathUtilクラスを追加。
Selection.Pick()メソッドの仕様変更。
RederingContextクラス、PixelFormatAttributeクラスのバグを修正
( -> Radeon系のビデオカードを使用している場合にレンダリングコンテキストの初期化でエラーが発生していたっぽい。)
サンプルプログラム(GLSharp_Demo)にQuadricsSample(GLUの2次曲面オブジェクトのサンプル)を追加。
一部のコードファイルのエンコードがシフトJISだったので、すべてのコードファイルのエンコードをUTF-8に変更。 など。

(2009.03.12)
ver. 5.2.1。
MeshModelクラスのMQOファイルロード部分について、
バグがあるという指摘をいただいたので修正。

(2008.11.13)
ver. 5.2.0。
テクスチャによるテキスト描画機能(TextureTextLabelクラス他)を追加。
そのついでに、テキスト描画関連クラスを再設計。
テキスト描画関連クラス名変更 : BitmapFontGlyph→BitmapGlyph、OutllineFontGlyph→PolygonGlyph、とか。
GLSControl、GLSFormのバグ(デバッグ無しで実行すると
アプリケーション終了後にプロセスが残ってしまう)を修正。

(2008.07.11)
Ver. 5.1.0。
OpenGLコントロールとか、Sceneクラスの導入とか、
アニメーションの基礎部分を実装とか、いろいろ機能を追加。
OpenTKも新しいバージョンに乗り換え(ver. 0.9.1)。

(2008.05.4)
Ver. 5.0.1。
Capture.CaptureBufferAsBitmapRGBAメソッドで
  バッファをキャプチャした画像の色がおかしかったのを修正。

(2008.04.05)
OpenGLラッパーをOpenTKに変更。
カメラの水平方向の回転がおかしかったのを修正、
Texture2Dクラスの内部構造の見直し、
その他いろいろ修正。

(2007.12.01)
MeshModelクラス MQO形式での書き出し(「MeshModel.SaveAsMQOFile」メソッド)で、
バグがあったので修正。
ついでにマテリアルやテクスチャを重複して書き出さないように若干改良。

(2007.11.17)
GLMQO(MQOローダー)をGLSharpへ統合して、ソースコード公開。
その他、いろいろ。

(2007.09.23)
Positionクラスをかなり書き換え。値変更時のイベントを追加、など。
OutlineFontLabelのTextMetricsプロパティの値がおかしかったのを修正。
Vector、Matrixクラス、double型用のオーバーロードメソッドを追加。

(2007.07.22)
基本部分を大幅に作り替え、エクステンションも使用可能になりました。
CameraやTexture2Dなども、結構変更されてます。

(2007.05.30)
テクスチャ作成時にミップマップを使用するように指定しても反映されないのを修正。

(2007.04.07)
Texture2Dクラスのコンストラクタで、エラーが発生する場合があったのを修正。

(2007.04.02)
細かい改良など。
MatrixクラスとCameraクラスに、
少し手を加えました。

(2007.03.28)
細かい部分の修正など。
実行環境に依存するかは不明ですが、
メッシュの頂点を点として描画すると急に重くなるのを、修正。

(2007.02.19)
文字列描画まわりをかなり変更。
文字を描画するディスプレイリストの作成・管理を行うクラスを追加、
それを利用して文字列描画を行うクラスも追加。

(2006.12.17)
大幅更新です。
Texture2Dクラスが、テクスチャ座標自動生成にも対応。
Mesh、Tessellator、OutlineFontMeshクラスなどを追加。
予告通り、テセレーションを行うクラスを追加しました。
簡単に輪郭線からメッシュを作成できます。
アウトラインフォントの文字をメッシュ化するクラスも追加。
MeshクラスはGLMQOから引っ越して、ソースコード公開です。
あと、マテリアルの色指定がちょっと便利になってます。
あちこち、細かい変更も多数あり。
デモプロジェクトも、新しい機能のデモを追加。

(2006.11.05)
あちらこちら、修正が入ってます。
OutlineFontTextクラスの機能追加とかも。
デモプロジェクトでは、
マウスでの視点操作に加えて、
バッファを画像としてキャプチャしてファイルに保存、
なんてこともしてます。
近いうちに、
GLUのテセレーションをサポートするクラスを追加するかも。


<back to OpenGL menu>