「Xamarin.MacでNSOpenGLViewを使う」の版間の差分
ナビゲーションに移動
検索に移動
imported>Administrator (→実装1) |
imported>Administrator (→ 実装1 ) |
||
11行目: | 11行目: | ||
[[Xamarin.Mac]]では[[OpenGL]]に加えて[[OpenTK]]も標準で使えるので非常に簡単に実装できる。 | [[Xamarin.Mac]]では[[OpenGL]]に加えて[[OpenTK]]も標準で使えるので非常に簡単に実装できる。 | ||
− | |||
− | |||
− | |||
− | |||
− | |||
=== 準備 === | === 準備 === | ||
21行目: | 16行目: | ||
[[ファイル:Xamarin.MacでOpenTKの参照を追加.png]] | [[ファイル:Xamarin.MacでOpenTKの参照を追加.png]] | ||
− | === | + | == NSOpenGLViewを継承したカスタムコントロールを作る == |
+ | *「[[Xamarin.Mac/カスタムコントロールを使用する]]」も参照 | ||
+ | |||
+ | === DrawRectメソッドをオーバーライドして描画処理を書く === | ||
三角形を描画してみる。 | 三角形を描画してみる。 | ||
<source lang="csharp"> | <source lang="csharp"> | ||
103行目: | 101行目: | ||
} | } | ||
</source> | </source> | ||
+ | |||
+ | === NSOpenGLViewを貼る === | ||
+ | Interface BuilderやStoryboardを開き、ViewControllerに「NSOpenGLView」を貼る。 | ||
+ | 他のNSView系コントロールと違い「NSCustomView」ではなく「NSOpenGLView」となる点に注意。 | ||
+ | |||
+ | === クラス名を書き換える === | ||
+ | NSOpenGLViewのクラス名を派生コントロールのものに書き換える。 | ||
+ | [[ファイル:Xamarin.MacでNSOpenGLViewの派生コントロールを貼る.png]] | ||
==関連項目== | ==関連項目== |
2017年3月31日 (金) 07:36時点における版
目次
概要
OpenGLは一見すると非常にシンプルなので簡単に扱えるように思えてくる。 するとCoreGraphicsだのCoreAnimationだので悩むより、OpenGLを使って2Dやった方が早い気がしてくる。 だがOpenGLには数々の罠や掟、シンプルすぎてある程度の規模になると実装が大変などの問題もがいっぱいある。 まさに死のワナの地下迷宮、いわゆるデストラップダンジョンである。 世の中でもっとも重要なのは適材適所であると教えてくれる。
実装1
Xamarin.MacではOpenGLに加えてOpenTKも標準で使えるので非常に簡単に実装できる。
準備
Xamarin.Macに標準で用意されているOpenTKの参照を追加する。
NSOpenGLViewを継承したカスタムコントロールを作る
DrawRectメソッドをオーバーライドして描画処理を書く
三角形を描画してみる。
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();
}
}
}
NSOpenGLViewを貼る
Interface BuilderやStoryboardを開き、ViewControllerに「NSOpenGLView」を貼る。 他のNSView系コントロールと違い「NSCustomView」ではなく「NSOpenGLView」となる点に注意。
クラス名を書き換える
NSOpenGLViewのクラス名を派生コントロールのものに書き換える。