Xamarin.mac에서 OpenTK 소개Introduction to OpenTK in Xamarin.Mac

OpenTK (The Open Toolkit) 고급, 하위 수준 C# 라이브러리를 보다 쉽게 OpenAL, OpenGL 및 OpenCL와 작업 하는 경우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.Mac 앱에서 OpenTK 사용에 대해 간략하게 소개 합니다.This article gives a brief introduction to using OpenTK in a Xamarin.Mac app.

이 문서에서는 Xamarin.Mac 응용 프로그램에서 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.

확인 하려는 경우는 노출 C# 클래스 / objective-c 메서드 섹션을 Xamarin.Mac 내부 요소 설명도 문서를 RegisterExport 명령 하 여 통신-C# 클래스 Objective-c 개체 및 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 (The Open Toolkit)는 고급, 하위 수준 C# 라이브러리 OpenAL, OpenGL 및 OpenCL와 작업을 더 쉽게 하는.As stated above, OpenTK (The Open Toolkit) is an advanced, low-level C# library that makes working with OpenGL, OpenCL and OpenAL easier. OpenTK Xamarin.Mac 앱에서 사용 하 여 다음과 같은 기능을 제공 합니다.Using OpenTK in a Xamarin.Mac app provides the following features:

  • 신속한 개발 -OpenTK 코딩 워크플로 개선 하 고 쉽고 빠르게 오류를 catch 하는 강력한 데이터 형식 및 인라인 설명서를 제공 합니다.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 옵션 -게임 및 Xamarin.Mac 위해 특별히 설계 된 고성능 게임 창, OpenTK 네이티브를 제공 합니다.Flexible GUI Options - OpenTK provides the native, high-performance Game Window designed specifically for games and Xamarin.Mac.
  • 완전히 관리 되 고 CLS 규격 코드 -OpenTK 없습니다 관리 되지 않는 라이브러리를 사용 하 여 macOS의 32 비트 및 64 비트 버전을 지원 합니다.Fully Managed, CLS-Compliant Code - OpenTK supports 32-bit and 64-bit versions of macOS with no unmanaged libraries.
  • 3D 수학 도구 키트 OpenTK 제공 Vector, Matrix, QuaternionBezier 해당 3D 수학 도구 키트를 통해 구조체입니다.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.

자세한 내용은 참조 하십시오 열려이 도구 키트 웹 사이트입니다.For more information, please see The Open Toolkit website.

OpenTK 빠른 시작OpenTK Quickstart

OpenTK Xamarin.Mac 앱에서 사용 하 여 빠른 소개의 경우와 게임 뷰를 엽니다. 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.Mac 솔루션을 만듭니다.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.Mac 응용 프로그램에서 열려 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

여러 참조 OpenTK Xamarin.Mac 클래스에서 사용 해야 합니다.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. 기존 창 콘텐츠를 교체 하기 때문에 주 Windows 크기를 조정할 때 자동으로 지정한 뷰에 조정 됩니다.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. 이 샘플 앱에 대 한 진행 중인 GL 뷰포트 동일한 크기 (자동 Mac 주 창에서 크기를 조정할 수)는 게임 뷰에 다음 코드를 사용 하 여: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
};

중요

Xamarin.Mac 구현의 OpenTK 포함 되지 않습니다는 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.Mac 버전용 하지 않습니다 호출을 SwapBuffers 메서드의 MonoMacGameView 렌더링 코드의 끝에 있는 인스턴스에 합니다.For the Xamarin.Mac version of OpenTK do not call the SwapBuffers method of your MonoMacGameView instance at the end of your rendering code. 이렇게 하면 게임 뷰의 strobe 렌더링 된 보기를 표시 하는 대신에 신속 하 게 합니다.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?

OpenTk 수행 Xamarin.mac 응용 프로그램에서 사용 하는 기본 기능을 사용 하 여 다음을 사용해의 몇 가지 제안 사항 다음과 같습니다.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.
  • 사용자는 키를 누를 때 색을 변경 하는 삼각형을 확인 합니다 UpdateFrameRenderFrame 이벤트 또는 사용자 고유의 사용자 지정 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, Vector3Vector4Matrix4 카메라 조작 위한 클래스입니다.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.Mac 버전 사용에 대 한 이러한 예제를 조정 해야 합니다.You'll have to adapt these examples for using with the Xamarin.Mac version of OpenTK.

OpenTK 구현의 복잡 Xamarin.Mac 예제를 참조 하세요. 당사의 MonoMacGameView 샘플입니다.For a more complex Xamarin.Mac example of an OpenTK implementation, please see our MonoMacGameView sample.

요약Summary

이 문서에서는 Xamarin.Mac 응용 프로그램에서 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.