ここまでで、C#によるOpenGLの開発環境が整いました。
今回は、GameWindowという、Mac/Linux/Windowsのいずれの環境でも動作するウィンドウ表示のコードを書きたいと思います。
このブログでの実際の開発はUbuntu上で進める予定ですが、Macや憎っくきWindows上でも開発可能な想定です。
using System;
using OpenTK;
namespace FloatingIsland
{
class FloatingIsland
{
static void Main(string[] args)
{
GameWindow gw = new GameWindow();
gw.Run();
}
}
}
これだけ!”FloatingIsland”は私が開発しようとしている新しいアプリ名です。
実行したら以下のエラーが出ました。’gbm’がロード出来ないようです。
例外が発生しました: CLR/System.TypeInitializationException
An unhandled exception of type 'System.TypeInitializationException' occurred in OpenTK.dll: 'The type initializer for 'OpenTK.DisplayDevice' threw an exception.'
Inner exceptions found, see $exception in variables window for more details.
Innermost exception System.DllNotFoundException : Unable to load DLL 'gbm': The specified module or one of its dependencies could not be found.
(Exception from HRESULT: 0x8007007E)
at OpenTK.Platform.Linux.Gbm.CreateDevice(Int32 fd)
at OpenTK.Platform.Linux.LinuxFactory.SetupDisplay(String gpu, IntPtr& gbm_device, IntPtr& egl_display)
at OpenTK.Platform.Linux.LinuxFactory.CreateDisplay(IntPtr& gbm_device, IntPtr& egl_display)
at OpenTK.Platform.Linux.LinuxFactory.get_gpu_fd()
at OpenTK.Platform.Linux.LinuxFactory.CreateDisplayDeviceDriver()
at OpenTK.DisplayDevice..cctor()
GBMとは:
Generic Buffer Management(GBM)は、Mesaに関連付けられたグラフィックスレンダリング用のバッファを割り当てるためのメカニズムを提供するAPIです。
Mesaとは:
Mesa3DとMesa 3D Graphics Libraryとも呼ばれるMesaは、OpenGL、Vulkanなどの仕様のオープンソースデバイスドライバとソフトウェア実装です。 Mesaは、これらの仕様をさまざまなベンダー固有のグラフィックハードウェアドライバに変換するクロスランゲージ、クロスプラットフォーム(主にBSDおよびLinux)の標準APIを実装しています。
‘gbm’を入れるには以下のコマンドを叩きます。
$ sudo apt-get install libgbm-dev
再度実行すると、またエラーが出ました。次は’libEGL.dll’がロード出来ないとのことです。
例外が発生しました: CLR/System.TypeInitializationException
An unhandled exception of type 'System.TypeInitializationException' occurred in OpenTK.dll: 'The type initializer for 'OpenTK.DisplayDevice' threw an exception.'
Inner exceptions found, see $exception in variables window for more details.
Innermost exception System.DllNotFoundException : Unable to load DLL 'libEGL.dll': The specified module or one of its dependencies could not be found.
(Exception from HRESULT: 0x8007007E)
at OpenTK.Platform.Egl.Egl.GetDisplay(IntPtr display_id)
at OpenTK.Platform.Linux.LinuxFactory.SetupDisplay(String gpu, IntPtr& gbm_device, IntPtr& egl_display)
at OpenTK.Platform.Linux.LinuxFactory.CreateDisplay(IntPtr& gbm_device, IntPtr& egl_display)
at OpenTK.Platform.Linux.LinuxFactory.get_gpu_fd()
at OpenTK.Platform.Linux.LinuxFactory.CreateDisplayDeviceDriver()
at OpenTK.DisplayDevice..cctor()
EGLとは:
EGLは、KhronosレンダリングAPI(OpenGL、OpenGL ES、OpenVGなど)と基本的なネイティブプラットフォームのウィンドウシステムとの間のインターフェイスです。 EGLはグラフィックス・コンテキスト管理、サーフェス/バッファー・バインディング、レンダリング同期を処理し、「他のKhronos APIを使用して高性能で高速化された混合モードの2Dおよび3Dレンダリング」を可能にします。EGLは非営利の技術コンソーシアムKhronos グループによって管理されています。
Khronosとは:
Khronos Groupは、アメリカの非営利団体。 様々なプラットフォームやデバイスの上で動作する、並列計算やグラフィックス、メディア用アプリケーションプログラミングインタフェース (API) のロイヤリティーフリーでオープンな標準規格を作成することを目的としている技術コンソーシアムである。
Khronosの策定する代表的な規格に、3DCG向けAPIであるOpenGL、GPGPUなどのヘテロジニアス・コンピューティング向けAPIであるOpenCLなどがある。
KhronosのメンバーはKhronosの策定するAPI仕様の開発に参加することができ、公開前の投票権を持ち、また(自身のプラットフォームやデバイスでそれらの規格を実装するための)規格草案および規格適合性試験への早期アクセスを通じて自身のプラットフォームおよびアプリケーションの提供を早めることができる。
以下のコマンドを叩きます。
sudo apt-get install libegl1-mesa-dev
実行すると以下のようなウィンドウが表示されます。Ubuntuで実行していますが、MacやWindowsでも同じコードで動作します。