Xamarin.ios의 OpenTK 소개Introduction to OpenTK in Xamarin.Mac

OpenTK (개방형 도구 키트)는 OpenGL, OpenCL 및 OpenAL C# 작업을 용이 하 게 하는 고급 하위 수준 라이브러리입니다.OpenTK (The Open Toolkit) is an advanced, low-level C# library that makes working with OpenGL, OpenCL and OpenAL easier. OpenTK는 3D 그래픽, 오디오 또는 계산 기능을 필요로 하는 게임, 공학용 응용 프로그램 또는 기타 프로젝트에 사용할 수 있습니다.OpenTK can be used for games, scientific applications or other projects that require 3D graphics, audio or computational functionality. 이 문서에서는 Xamarin.ios 앱에서 OpenTK 사용에 대 한 간략 한 소개를 제공 합니다.This article gives a brief introduction to using OpenTK in a Xamarin.Mac app.

이 문서에서는 Xamarin.ios 응용 프로그램의 OpenTK에 대 한 기본 사항을 다룹니다.In this article, we'll cover the basics of OpenTK in a Xamarin.Mac application. Hello, Mac 문서를 먼저 사용 하는 것이 가장 좋습니다. 특히 Xcode 및 Interface Builder콘센트 및 작업 섹션을 소개 하 고,에서 사용할 주요 개념 및 기술을 설명 하 고 있습니다. 이 문서를 참조 하세요.It is highly suggested that you work through the Hello, Mac article first, specifically the Introduction to Xcode and Interface Builder and Outlets and Actions sections, as it covers key concepts and techniques that we'll be using in this article.

Xamarin.ios 내부 문서의 목적에 따라 클래스/메서드 노출 C# 섹션을 살펴볼 수 있습니다. 여기에서는 C# 클래스를 목표에 연결 하는 데 사용 되는RegisterExport명령을 설명 합니다. 개체 및 UI 요소You may want to take a look at the Exposing C# classes / methods to Objective-C section of the Xamarin.Mac Internals document as well, it explains the Register and Export commands used to wire-up your C# classes to Objective-C objects and UI Elements.

OpenTK 정보About OpenTK

위에서 설명한 것 처럼 OpenTK (Open Toolkit)는 OpenGL, OpenCL 및 OpenAL 작업 C# 을 용이 하 게 하는 고급 하위 수준 라이브러리입니다.As stated above, OpenTK (The Open Toolkit) is an advanced, low-level C# library that makes working with OpenGL, OpenCL and OpenAL easier. Xamarin.ios 앱에서 OpenTK를 사용 하면 다음과 같은 기능을 제공 합니다.Using OpenTK in a Xamarin.Mac app provides the following features:

  • 신속한 개발 -OpenTK은 코딩 워크플로를 개선 하 고 오류를 보다 쉽고 빠르게 파악 하기 위한 강력한 데이터 형식 및 인라인 설명서를 제공 합니다.Rapid Development - OpenTK provides strong data types and inline documentation to improve your coding workflow and catch errors easier and sooner.
  • 간편한 통합 -OpenTK은 .net 응용 프로그램과 쉽게 통합 되도록 설계 되었습니다.Easy Integration - OpenTK was designed to easily integrate with .NET applications.
  • 관대 한 라이선스 -OPENTK는 MIT/X11 라이선스에 따라 배포 되며 완전히 무료입니다.Permissive License - OpenTK is distributed under the MIT/X11 Licenses and is totally free.
  • 형식이 안전한 다양 한 바인딩 -OpenTK는 자동 확장 로드, 오류 검사 및 인라인 설명서를 포함 하는 최신 버전의 OpenGL, OPENGL | ES, openal 및 OpenCL를 지원 합니다.Rich, Type-Safe Bindings - OpenTK supports the latest versions of OpenGL, OpenGL|ES, OpenAL and OpenCL with automatic extension loading, error checking and inline documentation.
  • 유연한 GUI 옵션 -OpenTK는 게임 및 xamarin.ios 전용으로 특별히 설계 된 고성능 게임 창을 제공 합니다.Flexible GUI Options - OpenTK provides the native, high-performance Game Window designed specifically for games and Xamarin.Mac.
  • 완전히 관리 되는 CLS 규격 코드 -OpenTK는 관리 되지 않는 라이브러리가 없는 32 비트 및 64 비트 버전의 macos를 지원 합니다.Fully Managed, CLS-Compliant Code - OpenTK supports 32-bit and 64-bit versions of macOS with no unmanaged libraries.
  • 3D 수학 도구 키트 OpenTK는 3D 수학 도구 키트를 통해 Vector, Matrix, QuaternionBezier 구조체를 제공 합니다.3D Math Toolkit OpenTK supplies Vector, Matrix, Quaternion and Bezier structs via its 3D Math Toolkit.

OpenTK는 3D 그래픽, 오디오 또는 계산 기능을 필요로 하는 게임, 공학용 응용 프로그램 또는 기타 프로젝트에 사용할 수 있습니다.OpenTK can be used for games, scientific applications or other projects that require 3D graphics, audio or computational functionality.

자세한 내용은 Toolkit 웹 사이트 열기 를 참조 하세요.For more information, please see The Open Toolkit website.

OpenTK 빠른 시작OpenTK Quickstart

Xamarin.ios 앱에서 OpenTK를 사용 하는 방법에 대 한 간략 한 소개로, 게임 보기를 여는 간단한 응용 프로그램을 만들고, 해당 보기에서 간단한 삼각형을 렌더링 하 고, Mac 앱의 주 창에 게임 보기를 attachs 하 여 사용자에 게 삼각형을 표시할 수 있습니다.As a quick introduction to using OpenTK in a Xamarin.Mac app, we are going to create a simple application that opens a Game View, renders a simple triangle in that view and attachs the Game View to the Mac app's Main Window to display the triangle to the user.

새 프로젝트를 시작 하는 중Starting a New Project

Mac용 Visual Studio를 시작 하 고 새 Xamarin.ios 솔루션을 만듭니다.Start Visual Studio for Mac and create a new Xamarin.Mac solution. Mac > > 일반 > cocoa 앱을 선택 합니다.Select Mac > App > General > Cocoa App:

프로젝트 이름에 대 한 MacOpenTK를 입력 합니다.Enter MacOpenTK for the Project Name:

만들기 단추를 클릭 하 여 새 프로젝트를 빌드합니다.Click the Create button to build the new project.

OpenTK 포함Including OpenTK

Xamarin.ios 응용 프로그램에서 Open TK를 사용 하려면 먼저 OpenTK 어셈블리에 대 한 참조를 포함 해야 합니다.Before you can use Open TK in a Xamarin.Mac application, you need to include a reference to the OpenTK assembly. 솔루션 탐색기에서 참조 폴더를 마우스 오른쪽 단추로 클릭 하 고 참조 편집...을 선택 합니다.In the Solution Explorer, right-click the References folder and select Edit References....

OpenTK 하 여 확인을 수행 하 고 확인 단추를 클릭 합니다.Place a check by OpenTK and click the OK button:

OpenTK 사용Using OpenTK

새 프로젝트를 만든 후 솔루션 탐색기 에서 MainWindow.cs 파일을 두 번 클릭 하 여 편집을 위해 엽니다.With the new project created, double-click the MainWindow.cs file in the Solution Explorer to open it for editing. MainWindow 클래스가 다음과 같이 표시 되도록 합니다.Make the MainWindow class look like the following:

using System;
using System.Drawing;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Platform.MacOS;
using Foundation;
using AppKit;
using CoreGraphics;

namespace MacOpenTK
{
    public partial class MainWindow : NSWindow
    {
        #region Computed Properties
        public MonoMacGameView Game { get; set; }
        #endregion

        #region Constructors
        public MainWindow (IntPtr handle) : base (handle)
        {
        }

        [Export ("initWithCoder:")]
        public MainWindow (NSCoder coder) : base (coder)
        {
        }
        #endregion

        #region Override Methods
        public override void AwakeFromNib ()
        {
            base.AwakeFromNib ();

            // Create new Game View and replace the window content with it
            Game = new MonoMacGameView(ContentView.Frame);
            ContentView = Game;

            // Wire-up any required Game events
            Game.Load += (sender, e) =>
            {
                // TODO: Initialize settings, load textures and sounds here
            };

            Game.Resize += (sender, e) =>
            {
                // Adjust the GL view to be the same size as the window
                GL.Viewport(0, 0, Game.Size.Width, Game.Size.Height);
            };

            Game.UpdateFrame += (sender, e) =>
            {
                // TODO: Add any game logic or physics
            };

            Game.RenderFrame += (sender, e) =>
            {
                // Setup buffer
                GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
                GL.MatrixMode(MatrixMode.Projection);

                // Draw a simple triangle
                GL.LoadIdentity();
                GL.Ortho(-1.0, 1.0, -1.0, 1.0, 0.0, 4.0);
                GL.Begin(BeginMode.Triangles);
                GL.Color3(Color.MidnightBlue);
                GL.Vertex2(-1.0f, 1.0f);
                GL.Color3(Color.SpringGreen);
                GL.Vertex2(0.0f, -1.0f);
                GL.Color3(Color.Ivory);
                GL.Vertex2(1.0f, 1.0f);
                GL.End();

            };

            // Run the game at 60 updates per second
            Game.Run(60.0);
        }
        #endregion
    }
}

아래에 자세히 설명 되어 있는 코드를 살펴보겠습니다.Let's go over this code in detail below.

필수 ApiRequired APIs

Xamarin.ios 클래스에서 OpenTK를 사용 하려면 몇 가지 참조가 필요 합니다.Several references are required to use OpenTK in a Xamarin.Mac class. 정의의 시작 부분에 다음 using 문이 포함 되었습니다.At the start of the definition we have included the following using statements:

using System;
using System.Drawing;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Platform.MacOS;
using Foundation;
using CoreGraphics;

이 최소 집합은 OpenTK를 사용 하는 모든 클래스에 필요 합니다.This minimal set will be required for any class using OpenTK.

게임 보기 추가Adding the Game View

다음으로 OpenTK와의 모든 상호 작용을 포함 하 고 결과를 표시 하는 게임 보기를 만들어야 합니다.Next we need to create a Game View to contain all of our interaction with OpenTK and display the results. 다음 코드를 사용 했습니다.We used the following code:

public MonoMacGameView Game { get; set; }
...

// Create new Game View and replace the window content with it
Game = new MonoMacGameView(ContentView.Frame);
ContentView = Game;

여기서는 주 Mac 창과 동일한 크기를 게임 보기에 적용 하 고 창의 콘텐츠 뷰를 새 MonoMacGameView로 대체 했습니다.Here we've made the Game View the same size as our Main Mac Window and replaced the Content View of the window with the new MonoMacGameView. 기존 창 내용을 대체 했기 때문에 주 창의 크기를 조정할 때 제공 된 보기의 크기가 자동으로 조정 됩니다.Because we replaced the existing window content, our Gave View will be automatically resized when the Main Windows is resized.

이벤트에 응답Responding to Events

각 게임 보기가 응답 해야 하는 몇 가지 기본 이벤트가 있습니다.There are several default events that each Game View should respond to. 이 섹션에서는 필요한 주요 이벤트를 다룹니다.In this section will cover the main events required.

Load 이벤트The Load Event

Load 이벤트는 이미지, 질감 또는 음악과 같은 디스크에서 리소스를 로드 하는 장소입니다.The Load event is the place to load resources from disk such as images, textures or music. 간단한 테스트 앱의 경우 Load 이벤트를 사용 하지 않지만 참조용으로 포함 되어 있습니다.For our simple, test app, we are not using the Load event, but have included it for reference:

Game.Load += (sender, e) =>
{
    // TODO: Initialize settings, load textures and sounds here
};

크기 조정 이벤트The Resize Event

게임 보기의 크기를 조정할 때마다 Resize 이벤트를 호출 해야 합니다.The Resize event should be called every time the Game View is resized. 샘플 앱의 경우 다음 코드를 사용 하 여 게임 보기 (Mac 주 창에의 한 자동 크기 조정)와 동일한 크기로 GL 뷰포트를 만듭니다.For our sample app, we are making the GL Viewport the same size as our Game View (which is be auto resized by the Mac Main Window) with the following code:

Game.Resize += (sender, e) =>
{
    // Adjust the GL view to be the same size as the window
    GL.Viewport(0, 0, Game.Size.Width, Game.Size.Height);
};

UpdateFrame 이벤트The UpdateFrame Event

UpdateFrame 이벤트는 사용자 입력을 처리 하 고, 개체 위치를 업데이트 하 고, 물리 또는 AI 계산을 실행 하는 데 사용 됩니다.The UpdateFrame event is used to handle user input, update object positions, run physics or AI calculations. 간단한 테스트 앱의 경우 UpdateFrame 이벤트를 사용 하지 않지만 참조용으로 포함 되어 있습니다.For our simple, test app, we are not using the UpdateFrame event, but have included it for reference:

Game.UpdateFrame += (sender, e) =>
{
    // TODO: Add any game logic or physics
};

중요

OpenTK의 Xamarin.ios 구현에는 Input API포함 되지 않으므로 키보드 및 마우스 지원을 추가 하려면 Apple에서 제공 하는 Api를 사용 해야 합니다.The Xamarin.Mac implementation of OpenTK does not include the Input API, so you will need to use the Apple provided APIs to add keyboard and Mouse support. 선택적으로 MonoMacGameView의 사용자 지정 인스턴스를 만들고 KeyDownKeyUp 메서드를 재정의할 수 있습니다.Optionally you can create a custom instance of the MonoMacGameView and override the KeyDown and KeyUp methods.

RenderFrame 이벤트The RenderFrame Event

RenderFrame 이벤트에는 그래픽을 렌더링 (그리기) 하는 데 사용 되는 코드가 포함 되어 있습니다.The RenderFrame event contains the code that is used to render (draw) your graphics. 예제 앱의 경우 간단한 삼각형으로 게임 보기를 채웁니다.For our example app, we are filling the Game View with a simple triangle:

Game.RenderFrame += (sender, e) =>
{
    // Setup buffer
    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
    GL.MatrixMode(MatrixMode.Projection);

    // Draw a simple triangle
    GL.LoadIdentity();
    GL.Ortho(-1.0, 1.0, -1.0, 1.0, 0.0, 4.0);
    GL.Begin(BeginMode.Triangles);
    GL.Color3(Color.MidnightBlue);
    GL.Vertex2(-1.0f, 1.0f);
    GL.Color3(Color.SpringGreen);
    GL.Vertex2(0.0f, -1.0f);
    GL.Color3(Color.Ivory);
    GL.Vertex2(1.0f, 1.0f);
    GL.End();

};

일반적으로 렌더링 코드는 새 요소를 그리기 전에 기존 요소를 제거 하는 GL.Clear에 대 한 호출을 수행 합니다.Typically the render code will being with a call to GL.Clear to remove any existing elements before drawn the new elements.

중요

OpenTK의 Xamarin.ios 버전에서 렌더링 코드의 끝에 MonoMacGameView 인스턴스의 SwapBuffers 메서드를 호출 하지 마십시오 .For the Xamarin.Mac version of OpenTK do not call the SwapBuffers method of your MonoMacGameView instance at the end of your rendering code. 이렇게 하면 렌더링 된 뷰를 표시 하는 대신 게임 보기가 섬광에 빠르게 표시 됩니다.Doing so will cause the Game View to strobe rapidly instead of displaying your rendered view.

게임 보기 실행Running the Game View

모든 필수 이벤트를 정의 하 고 게임 보기를 앱의 기본 Mac 창에 연결 하면 게임 보기를 실행 하 고 그래픽을 표시 하기 위해 읽혀집니다.With all of the required events define and the Game View attached to the Main Mac Window of our app, we are read to run the Game View and display our graphics. 다음 코드를 사용합니다.Use the following code:

// Run the game at 60 updates per second
Game.Run(60.0);

게임 보기를 업데이트 하는 데 필요한 프레임 속도를 전달 합니다. 예를 들어, 예를 들어 초당 프레임 60 (일반 TV와 동일한 새로 고침 속도)를 선택 했습니다.We pass in the desired frame rate that we want the Game View to update at, for our example we have chosen 60 frames per second (the same refresh rate as normal TV).

앱을 실행 하 고 출력을 확인 하겠습니다.Let's run our app and see the output:

창의 크기를 조정 하는 경우 게임 보기만 존재 하며 삼각형의 크기를 조정 하 고 실시간으로 업데이트 합니다.If we resize our window, the Game View will also be reside and the triangle will be resized and updated real-time as well.

다음 위치Where to Next?

Xamarin.ios 응용 프로그램에서 OpenTk 작업을 수행 하는 기본 사항을 사용 하 여 다음에 사용해 볼 수 있는 몇 가지 제안 사항을 확인할 수 있습니다.With the basics of working with OpenTk in a Xamarin.mac application done, here are some suggestions of what to try out next:

  • LoadRenderFrame 이벤트에서 게임 보기의 삼각형 색과 배경색을 변경해 보세요.Try changing the color of the triangle and the background color of the Game View in the Load and RenderFrame events.
  • 사용자가 UpdateFrame의 키를 누르고 이벤트를 RenderFrame 하거나 사용자 지정 MonoMacGameView 클래스를 만들어 KeyUpKeyDown 메서드를 재정의 하는 경우 삼각형 변경 색을 설정 합니다.Make the triangle change color when the user press a key in the UpdateFrame and RenderFrame events or make your own custom MonoMacGameView class and override the KeyUp and KeyDown methods.
  • UpdateFrame 이벤트에서 인식 되는 키를 사용 하 여 삼각형이 화면에서 이동 하도록 합니다.Make the triangle move across the screen using the aware keys in the UpdateFrame event. 힌트: Matrix4.CreateTranslation 메서드를 사용 하 여 변환 행렬을 만들고 GL.LoadMatrix 메서드를 호출 하 여 RenderFrame 이벤트에서 로드 합니다.Hint: use the Matrix4.CreateTranslation method to create a translation matrix and call the GL.LoadMatrix method to load it in the RenderFrame event.
  • for 루프를 사용 하 여 RenderFrame 이벤트에서 여러 삼각형을 렌더링 합니다.Use a for loop to render several triangles in the RenderFrame event.
  • 카메라를 회전 하 여 3D 공간에서 삼각형의 다른 보기를 제공 합니다.Rotate the camera to give a different view of the triangle in 3D space. 힌트: Matrix4.CreateTranslation 메서드를 사용 하 여 변환 행렬을 만들고 GL.LoadMatrix 메서드를 호출 하 여 로드 합니다.Hint: use the Matrix4.CreateTranslation method to create a translation matrix and call the GL.LoadMatrix method to load it. 카메라 조작을 위해 Vector2, Vector3, Vector4Matrix4 클래스를 사용할 수도 있습니다.You can also use the Vector2, Vector3, Vector4 and Matrix4 classes for camera manipulations.

더 많은 예제는 OpenTK 샘플 GitHub 리포지토리를 참조 하세요.For more examples, please see the OpenTK Samples GitHub repo. OpenTK 사용의 공식 예제 목록이 포함 되어 있습니다.It contains an official list of examples of using OpenTK. OpenTK의 Xamarin.ios 버전과 함께를 사용 하기 위해 이러한 예제를 조정 해야 합니다.You'll have to adapt these examples for using with the Xamarin.Mac version of OpenTK.

OpenTK 구현에 대 한 보다 복잡 한 Xamarin.ios 예제는 MonoMacGameView 샘플을 참조 하세요.For a more complex Xamarin.Mac example of an OpenTK implementation, please see our MonoMacGameView sample.

요약Summary

이 문서에서는 Xamarin.ios 응용 프로그램에서 OpenTK를 사용 하는 방법을 간략히 살펴보겠습니다.This article has taken a quick look at working with OpenTK in a Xamarin.Mac application. 게임 창을 만드는 방법, 게임 창을 Mac 창에 연결 하는 방법 및 게임 창에서 간단한 셰이프를 렌더링 하는 방법을 살펴보았습니다.We saw how to create a Game Window, how to attach the Game Window to a Mac Window and how to render a simple shape in the Game Window.