差分
ナビゲーションに移動
検索に移動
==概要==
[[OpenGL]]は一見すると非常にシンプルなので簡単に扱えるように思えてくる。
すると[[CoreGraphics]]だの[[CoreAnimation]]だので悩むより、[[OpenGL]]を使って2Dやった方が早い気がしてくる。
だがOpenGLには数々の罠や掟、シンプルすぎてある程度の規模になると実装が大変などの問題もがいっぱいある。
まさに[[死のワナの地下迷宮]]、いわゆる[[デストラップダンジョン]]である。
世の中でもっとも重要なのは[[適材適所]]であると教えてくれる。
==実装1==
[[Xamarin.Mac]]では[[OpenGL]]に加えて[[OpenTK]]も標準で使えるので非常に簡単に実装できる。
基本的には以下の手順だけで利用できる
*NSOpenGLViewを継承したカスタムコントロールを作る
*:「[[Xamarin.Mac/カスタムコントロールを使用する]]」も参照
*DrawRectメソッドをオーバーライドして描画処理を書く
三角形を描画してみる。
<source lang="csharp">
using System;
using System.Drawing;
using System.IO;
using Foundation;
using AppKit;
using CoreGraphics;
using OpenGL;
using OpenTK;
using OpenTK.Graphics.OpenGL;
[Register("MBOpenGLView")]
public class MBOpenGLView : NSOpenGLView
{
public MBOpenGLView()
: base()
{
Init();
}
public MBOpenGLView(IntPtr handle)
: base(handle)
{
Init();
}
public MBOpenGLView(NSCoder coder)
: base(coder)
{
Init();
}
public MBOpenGLView(CGRect rect)
: base(rect)
{
Init();
}
public MBOpenGLView(CGRect rect, NSOpenGLPixelFormat format)
: base(rect, format)
{
Init();
}
void Init()
{
}
public override void DrawRect(CoreGraphics.CGRect dirtyRect)
{
var backingBounds = this.ConvertRectToBacking(this.Bounds);
Console.WriteLine(backingBounds);
GL.Viewport(0, 0, (int)backingBounds.Width, (int)backingBounds.Height);
using (var glc = this.OpenGLContext)
{
// コンテキストを有効化する
glc.MakeCurrentContext();
// 描画コマンド群
GL.Color3(0.7f, 0.2f, 0.2f);
GL.Begin(BeginMode.Triangles);
{
GL.Vertex3( 0.0f, 0.5f, 0.0f);
GL.Vertex3(-0.5f, -0.5f, 0.0f);
GL.Vertex3( 0.5f, -0.5f, 0.0f);
}
GL.End();
// キューに入ってる描画コマンド群を実行する
GL.Flush();
// 画面を更新する
// Dispose()のタイミングでも実行される模様なのでusing句を使えば省略できそうだ。
//glc.FlushBuffer();
}
}
}
</source>
==関連項目==
*[[Xamarin.Mac/NSOpenGLViewをRetina Displayに対応させる]]
*[[Xamarin.Mac/カスタムコントロールを使用する]]
==参考文献==
{{reflist}}
{{stub}}
[[category:Xamarin.Mac]]
==概要==
[[OpenGL]]は一見すると非常にシンプルなので簡単に扱えるように思えてくる。
すると[[CoreGraphics]]だの[[CoreAnimation]]だので悩むより、[[OpenGL]]を使って2Dやった方が早い気がしてくる。
だがOpenGLには数々の罠や掟、シンプルすぎてある程度の規模になると実装が大変などの問題もがいっぱいある。
まさに[[死のワナの地下迷宮]]、いわゆる[[デストラップダンジョン]]である。
世の中でもっとも重要なのは[[適材適所]]であると教えてくれる。
==実装1==
[[Xamarin.Mac]]では[[OpenGL]]に加えて[[OpenTK]]も標準で使えるので非常に簡単に実装できる。
基本的には以下の手順だけで利用できる
*NSOpenGLViewを継承したカスタムコントロールを作る
*:「[[Xamarin.Mac/カスタムコントロールを使用する]]」も参照
*DrawRectメソッドをオーバーライドして描画処理を書く
三角形を描画してみる。
<source lang="csharp">
using System;
using System.Drawing;
using System.IO;
using Foundation;
using AppKit;
using CoreGraphics;
using OpenGL;
using OpenTK;
using OpenTK.Graphics.OpenGL;
[Register("MBOpenGLView")]
public class MBOpenGLView : NSOpenGLView
{
public MBOpenGLView()
: base()
{
Init();
}
public MBOpenGLView(IntPtr handle)
: base(handle)
{
Init();
}
public MBOpenGLView(NSCoder coder)
: base(coder)
{
Init();
}
public MBOpenGLView(CGRect rect)
: base(rect)
{
Init();
}
public MBOpenGLView(CGRect rect, NSOpenGLPixelFormat format)
: base(rect, format)
{
Init();
}
void Init()
{
}
public override void DrawRect(CoreGraphics.CGRect dirtyRect)
{
var backingBounds = this.ConvertRectToBacking(this.Bounds);
Console.WriteLine(backingBounds);
GL.Viewport(0, 0, (int)backingBounds.Width, (int)backingBounds.Height);
using (var glc = this.OpenGLContext)
{
// コンテキストを有効化する
glc.MakeCurrentContext();
// 描画コマンド群
GL.Color3(0.7f, 0.2f, 0.2f);
GL.Begin(BeginMode.Triangles);
{
GL.Vertex3( 0.0f, 0.5f, 0.0f);
GL.Vertex3(-0.5f, -0.5f, 0.0f);
GL.Vertex3( 0.5f, -0.5f, 0.0f);
}
GL.End();
// キューに入ってる描画コマンド群を実行する
GL.Flush();
// 画面を更新する
// Dispose()のタイミングでも実行される模様なのでusing句を使えば省略できそうだ。
//glc.FlushBuffer();
}
}
}
</source>
==関連項目==
*[[Xamarin.Mac/NSOpenGLViewをRetina Displayに対応させる]]
*[[Xamarin.Mac/カスタムコントロールを使用する]]
==参考文献==
{{reflist}}
{{stub}}
[[category:Xamarin.Mac]]