다음을 통해 공유


Xamarin.Mac의 OpenTK 소개

OpenTK(Open Toolkit)는 OpenGL, OpenCL 및 OpenAL을 더 쉽게 사용할 수 있는 고급 하위 수준 C# 라이브러리입니다. OpenTK는 게임, 과학 애플리케이션 또는 3D 그래픽, 오디오 또는 계산 기능이 필요한 기타 프로젝트에 사용할 수 있습니다. 이 문서에서는 Xamarin.Mac 앱에서 OpenTK를 사용하는 방법을 간략하게 소개합니다.

앱 실행 예제

이 문서에서는 Xamarin.Mac 애플리케이션에서 OpenTK의 기본 사항을 설명합니다. 이 문서에서 사용할 주요 개념과 기술을 다루므로 Hello, Mac 문서, 특히 Xcode 및 인터페이스 작성기 및 콘센트 및 작업 소개 섹션을 통해 작업하는 것이 좋습니다.

Xamarin.Mac Internals 문서의 섹션에 Objective-C 대한 C# 클래스/메서드 노출을 살펴보고, Register C# 클래스 Objective-C 를 개체 및 UI 요소에 연결하는 데 사용되는 명령과 Export 설명합니다.

OpenTK 정보

위에서 설명한 것처럼 OpenTK(Open Toolkit)는 OpenGL, OpenCL 및 OpenAL을 더 쉽게 사용할 수 있는 고급 하위 수준 C# 라이브러리입니다. Xamarin.Mac 앱에서 OpenTK를 사용하면 다음과 같은 기능이 제공됩니다.

  • 빠른 개발 - OpenTK는 코딩 워크플로를 개선하고 오류를 더 쉽고 빠르게 catch할 수 있도록 강력한 데이터 형식 및 인라인 설명서를 제공합니다.
  • 간편한 통합 - OpenTK는 .NET 애플리케이션과 쉽게 통합되도록 설계되었습니다.
  • 허용 라이선스 - OpenTK는 MIT/X11 라이선스에 따라 배포되며 완전히 무료입니다.
  • 다양한 형식 금고 바인딩 - OpenTK는 자동 확장 로드, 오류 검사 및 인라인 설명서를 사용하여 최신 버전의 OpenGL, OpenGL|ES, OpenAL 및 OpenCL을 지원합니다.
  • 유연한 GUI 옵션 - OpenTK는 게임 및 Xamarin.Mac용으로 특별히 설계된 기본 고성능 게임 창을 제공합니다.
  • 완전 관리형 CLS 규격 코드 - OpenTK는 관리되지 않는 라이브러리가 없는 32비트 및 64비트 버전의 macOS를 지원합니다.
  • 3D 수학 도구 키트 OpenTK는 QuaternionVectorMatrix3D 수학 도구 키트를 통해 제공 및 Bezier 구조체를 제공합니다.

OpenTK는 게임, 과학 애플리케이션 또는 3D 그래픽, 오디오 또는 계산 기능이 필요한 기타 프로젝트에 사용할 수 있습니다.

자세한 내용은 Open Toolkit 웹 사이트를 참조하세요.

OpenTK 빠른 시작

Xamarin.Mac 앱에서 OpenTK를 사용하는 방법에 대한 빠른 소개로, 게임 보기를 열고, 해당 보기에서 간단한 삼각형을 렌더링하고, Mac 앱의 주 창에 게임 보기를 연결하여 사용자에게 삼각형을 표시하는 간단한 애플리케이션을 만들려고 합니다.

새 프로젝트 시작

Mac용 Visual Studio 시작하고 새 Xamarin.Mac 솔루션을 만듭니다. Mac>>일반>코코아 앱을 선택합니다.

새 Cocoa 앱 추가

프로젝트 이름을 입력 MacOpenTK 합니다.

프로젝트 이름 설정

만들기 단추를 클릭하여 새 프로젝트를 빌드합니다.

OpenTK 포함

Xamarin.Mac 애플리케이션에서 Open TK를 사용하려면 OpenTK 어셈블리에 대한 참조를 포함해야 합니다. 솔루션 탐색기 참조 폴더를 마우스 오른쪽 단추로 클릭하고 참조 편집...을 선택합니다.

검사 OpenTK 배치하고 확인 단추를 클릭합니다.

프로젝트 참조 편집

OpenTK 사용

새 프로젝트를 만든 상태에서 솔루션 탐색기 파일을 두 번 클릭하여 MainWindow.cs 편집용으로 엽니다. 클래스를 MainWindow 다음과 같이 표시합니다.

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;
            Game.OpenGLContext.View = 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
    }
}

아래에서 이 코드를 자세히 살펴보겠습니다.

필수 API

Xamarin.Mac 클래스에서 OpenTK를 사용하려면 몇 가지 참조가 필요합니다. 정의의 시작 부분에 다음 using 문이 포함되어 있습니다.

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

이 최소 집합은 OpenTK를 사용하는 모든 클래스에 필요합니다.

게임 보기 추가

다음으로 OpenTK와의 모든 상호 작용을 포함하고 결과를 표시하는 게임 보기를 만들어야 합니다. 다음 코드를 사용했습니다.

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창으로 바꿉니다. 기존 창 콘텐츠를 대체했으므로 주 창의 크기가 조정되면 제공된 보기의 크기가 자동으로 조정됩니다.

이벤트에 응답

각 게임 보기에 응답해야 하는 몇 가지 기본 이벤트가 있습니다. 이 섹션에서는 필요한 기본 이벤트를 다룹니다.

Load 이벤트

Load 이벤트는 이미지, 질감 또는 음악과 같은 디스크에서 리소스를 로드하는 장소입니다. 간단한 테스트 앱의 경우 이벤트를 사용하지 Load 않지만 참조용으로 포함했습니다.

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

크기 조정 이벤트

Resize 게임 보기의 크기를 조정할 때마다 이벤트를 호출해야 합니다. 샘플 앱의 경우 다음 코드를 사용하여 GL 뷰포트를 게임 보기(Mac 주 창에서 자동으로 크기 조정)와 동일한 크기로 만듭니다.

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 이벤트

UpdateFrame 이벤트는 사용자 입력을 처리하고, 개체 위치를 업데이트하고, 물리학 또는 AI 계산을 실행하는 데 사용됩니다. 간단한 테스트 앱의 경우 이벤트를 사용하지 UpdateFrame 않지만 참조용으로 포함했습니다.

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

Important

OpenTK의 Xamarin.Mac 구현에는 포함되지 Input API않으므로 Apple 제공 API를 사용하여 키보드 및 마우스 지원을 추가해야 합니다. 필요에 따라 사용자 지정 인스턴스를 만들고 해당 인스턴스 KeyUp 와 메서드를 재정의 MonoMacGameViewKeyDown 수 있습니다.

RenderFrame 이벤트

이벤트에는 RenderFrame 그래픽을 렌더링(그리기)하는 데 사용되는 코드가 포함되어 있습니다. 예제 앱의 경우 간단한 삼각형으로 게임 보기를 채웁니다.

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 을 사용합니다.

Important

Xamarin.Mac 버전의 OpenTK의 경우 렌더링 코드의 끝에서 인스턴스의 MonoMacGameView 메서드를 호출 SwapBuffers 하지 않습니다. 이렇게 하면 렌더링된 보기를 표시하는 대신 게임 보기가 빠르게 스트로브됩니다.

게임 보기 실행

모든 필수 이벤트 정의 및 앱의 주 Mac 창에 연결된 게임 보기를 사용하여 게임 보기를 실행하고 그래픽을 표시합니다. 다음 코드를 사용합니다.

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

게임 보기에서 업데이트하려는 원하는 프레임 속도를 전달합니다. 예를 들어 초당 프레임(일반 TV와 동일한 새로 고침 속도)을 선택 60 했습니다.

앱을 실행하고 출력을 살펴보겠습니다.

앱 출력 샘플

창의 크기를 조정하면 게임 보기도 상주하며 삼각형의 크기가 조정되고 실시간으로 업데이트됩니다.

다음 위치

Xamarin.mac 애플리케이션에서 OpenTk를 사용하는 기본 사항을 사용하여 다음을 시도해 보기 위한 몇 가지 제안 사항은 다음과 같습니다.

  • 삼각형의 색과 이벤트 내 게임 보기의 배경색을 LoadRenderFrame 변경해 보세요.
  • 사용자가 이벤트 및 이벤트에서 키를 UpdateFrame 누르거나 고유한 사용자 지정 MonoMacGameView 클래스를 만들고 해당 클래스와 RenderFrame 메서드를 재정의할 때 삼각형 색을 KeyUpKeyDown 변경합니다.
  • 이벤트의 인식 키를 사용하여 삼각형을 화면 전체로 UpdateFrame 이동합니다. 힌트: 메서드를 Matrix4.CreateTranslation 사용하여 변환 행렬을 만들고 메서드를 GL.LoadMatrix 호출하여 이벤트에 로드합니다 RenderFrame .
  • 루프를 for 사용하여 이벤트에서 여러 삼각형을 렌더링합니다 RenderFrame .
  • 카메라를 회전하여 3D 공간에서 삼각형을 다른 보기로 표시합니다. 힌트: 메서드를 Matrix4.CreateTranslation 사용하여 번역 행렬을 만들고 메서드를 GL.LoadMatrix 호출하여 로드합니다. 카메라 조작을 Vector2위해 , Vector3Vector4Matrix4 클래스를 사용할 수도 있습니다.

자세한 예제는 OpenTK 샘플 GitHub 리포지토리를 참조하세요. 여기에는 OpenTK 사용 예제의 공식 목록이 포함되어 있습니다. OpenTK의 Xamarin.Mac 버전과 함께 사용하기 위해 이러한 예제를 조정해야 합니다.

요약

이 문서에서는 Xamarin.Mac 애플리케이션에서 OpenTK로 작업하는 것을 간단히 살펴보았습니다. 게임 창을 만드는 방법, Mac 창에 게임 창을 연결하는 방법 및 게임 창에서 간단한 셰이프를 렌더링하는 방법을 알아보았습니다.