Xamarin.MacでNSOpenGLViewを使う

提供: MonoBook
2015年4月27日 (月) 03:36時点におけるimported>Administratorによる版 (ページの作成:「 ==概要== OpenGLは一見すると非常にシンプルなので簡単に扱えるように思えてくる。 するとCoreGraphicsだのCoreAnimationだ...」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動


概要

OpenGLは一見すると非常にシンプルなので簡単に扱えるように思えてくる。 するとCoreGraphicsだのCoreAnimationだので悩むより、OpenGLを使って2Dやった方が早い気がしてくる。 だがOpenGLには数々の罠や掟、シンプルすぎてある程度の規模になると実装が大変などの問題もがいっぱいある。 まさに死のワナの地下迷宮、いわゆるデストラップダンジョンである。 世の中でもっとも重要なのは適材適所であると教えてくれる。

実装1

Xamarin.MacではOpenGLに加えて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();
            }
        }
    }

関連項目

参考文献