【C#】openTKを使用してみる

前回はAltseedというライブラリを使用してみたのですが、

このライブラリって調べてみると、構造はシンプルでゲーム制作に必要な機能は一通り揃っている(と思う)のですが、

シンプルすぎるというか、基本的なグラフィックス機能が少々貧弱な気がします。

例えば、四角形を表示させる場合、色の指定はできず、基本的に画像をテクスチャとして表示する、というイメージです。

なので、もうちょっと調べてみました。

ゲームライブラリにこだわらず、グラフィックスライブラリという括りで検索してみると、openTKというライブラリを発見しました。

https://opentk.net/index.html

これはopenGLのラッパーのライブラリですね。

openGLの機能はほぼほぼ使用できると考えていいようです。

NuGetに登録されているのでNuGetからopenTKを検索するとダウンロードして参照できるようになります。

サンプルコードを入力してみました。

https://masuqat.net/programming/csharp/OpenTK00-03.php

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Input;

namespace OpenTK_sample
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            using (Game window = new Game())
            {
                window.Run(30.0);
            }
        }
    }

    class Game : GameWindow
    {
        public Game() : base(800, 600, GraphicsMode.Default, "0-3:GameWindow")
        {
        }

        //ウィンドウの起動時に実行される。
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            GL.ClearColor(Color4.Black);
            GL.Enable(EnableCap.DepthTest);
        }

        //ウィンドウのサイズが変更された場合に実行される。
        protected override void OnResize(EventArgs e)
        {
            base.OnResize(e);

            GL.Viewport(ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height);
            GL.MatrixMode(MatrixMode.Projection);
            Matrix4 projection = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4, (float)Width / (float)Height, 1.0f, 64.0f);
            GL.LoadMatrix(ref projection);
        }

        //画面描画で実行される。
        protected override void OnRenderFrame(FrameEventArgs e)
        {
            base.OnRenderFrame(e);

            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

            GL.MatrixMode(MatrixMode.Modelview);
            Matrix4 modelview = Matrix4.LookAt(Vector3.Zero, Vector3.UnitZ, Vector3.UnitY);
            GL.LoadMatrix(ref modelview);

            GL.Begin(BeginMode.Quads);

            GL.Color4(Color4.White);                            //色名で指定
            GL.Vertex3(-1.0f, 1.0f, 4.0f);
            GL.Color4(new float[] { 1.0f, 0.0f, 0.0f, 1.0f });  //配列で指定
            GL.Vertex3(-1.0f, -1.0f, 4.0f);
            GL.Color4(0.0f, 1.0f, 0.0f, 1.0f);                  //4つの引数にfloat型で指定
            GL.Vertex3(1.0f, -1.0f, 4.0f);
            GL.Color4((byte)0, (byte)0, (byte)255, (byte)255);  //byte型で指定
            GL.Vertex3(1.0f, 1.0f, 4.0f);

            GL.End();

            SwapBuffers();
        }
    }
}

これだけではちょっと難しそうだけど、必要なものだけ使用すればうまくいきそう。

ただ、一番の問題は座標系。

openGLの世界では、(0,0)がウインドウの中心にあり、左上が(-1.0-1.0)で右下が(1.0,1.0)になる。

これはこれで扱いが難しい。

うーん、ハードルが高い・・・。

CGを使うにはちょうどいいかもしれないけどね。