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