유튜브에 올라와있는 'OpenTK' 플랫폼 튜토리얼을 따라하는 포스팅입니다.

 

'OpenTK'는 'OpenGL', 'OpenCL', 'OpenAL'가 합쳐진 C#랩퍼입니다.

 

0. 원본

 

OpenTK Platformer Tutorial: Part 1 - Clearing and Drawing in our Custom Game Class

게임(Game) 클래스를 만들어 화면을 초기화(Clearing)하고 서페이스(surface)를 그리는 방법.

 

 

1. 게임 클래스 만들기

프로젝트에 'Game'클래스를 만들어 줍니다.

이 클래스는 'GameWindow'를 상속받습니다.

그리고 주요 이벤트를 오버라이드(override, 재정의)해줍니다.

 

class Game : GameWindow
{
	public Game(int width, int height)
		: base(width, height)
	{
	}

	protected override void OnLoad(EventArgs e)
	{
		base.OnLoad(e);
	}

	protected override void OnUpdateFrame(FrameEventArgs e)
	{
		base.OnUpdateFrame(e);
	}

	protected override void OnRenderFrame(FrameEventArgs e)
	{
		base.OnRenderFrame(e);
	}

}

 

 

이제 메인에서 이 클래스를 호출해주면 바로 전 튜토리얼과 같은 동작을 하는 것을 볼 수 있습니다.

 

class Program
{
	static void Main(string[] args)
	{
		Game window = new Game(640, 480);
		window.Run();
	}
}

 

 

 

 

2. 화면 초기화

'OpenGL'을 컨트롤 하기위해 'OpenTK'에서는 'GL'을 제공합니다.

'using OpenTK.Graphics.OpenGL;'를 유징하면 별도의 인스턴스 없이 사용이 가능합니다.

화면을 새로 그리려고 할때 'OnRenderFrame'이 발생하므로 'OnRenderFrame'에서 처리하면 됩니다.

 

2-1. 화면 비우기

'GL.Clear(ClearBufferMask);'를 사용하여 화면을 비울 수 있습니다.

이렇게 비워진 화면을 표시하기위해 'GameWindow.SwapBuffers();'를 이용합니다.

protected override void OnRenderFrame(FrameEventArgs e)
{
	base.OnRenderFrame(e);

	GL.Clear(ClearBufferMask.ColorBufferBit);

	this.SwapBuffers();
}

 

테스트 해봅시다.

 

 

이제 화면이 초기화가 되서 검정색으로 보입니다.

 

 

2-2. 초기화 색 넣기

 

화면을 초기화할때 색을 넣기위해 'GL.ClearColor(Color);'를 사용합니다.

'Color'은 'System.Drawing'에 있으므로 참조를 추가하지 않았다면 표시되지 안을 수 있습니다.

protected override void OnRenderFrame(FrameEventArgs e)
{
	base.OnRenderFrame(e);

	GL.Clear(ClearBufferMask.ColorBufferBit);
	GL.ClearColor(Color.CornflowerBlue);

	this.SwapBuffers();
}

 

 

이제 테스트를 해봅시다.

 

 

 

하늘색으로 화면이 초기화 되었습니다.

 

 

3. 버텍스(vertex)와 서페이스(surface)

3D공간에 모델을 만들기위한 꼭지점을 버택스(vertex)라고 하고 이 꼭지점을 이어서 만든 것을 서페이스(surface, 표면)이라고 합니다.

이것은 3D프로그래밍을 할때 항상나오는 것이라 자세한 내용은 다른 곳에서 찾으시면 됩니다.

 

3-1. 2D버택스로 사각형 서페이스만들기

그러고보니 보통 3D프로그래밍 예제는 삼각형 만들기를 하는데 이 튜토리얼은 사각형 만들기를 하네요 ㅎㅎㅎ

버텍스를 찍기전에 'GL.Begin(PrimitiveType)'호출한여 버퍼에 접근 할 수 있게 한후 버텍스를 찍고 'GL.End()'를 호출하여 버퍼를 닫습니다.

protected override void OnRenderFrame(FrameEventArgs e)
{
	base.OnRenderFrame(e);

	GL.Clear(ClearBufferMask.ColorBufferBit);
	GL.ClearColor(Color.CornflowerBlue);
			
	GL.Begin(PrimitiveType.Quads);

	GL.Vertex2(0, 0);		//Top, Left
	GL.Vertex2(0.9f, 0);		//Top, Right
	GL.Vertex2(1, -0.9f);	//Bottom, Right
	GL.Vertex2(0, -1);		//Bottom, Left

	GL.End();

	this.SwapBuffers();
}

 

 

테스트를 해봅시다.

 

 

 

좌표를 약간 변형했더니 이런모양이 나왔습니다 ㅎㅎㅎ

 

GL.Vertex2(0, 0); //Top, Left
GL.Vertex2(1, 0); //Top, Right
GL.Vertex2(1, -1); //Bottom, Right
GL.Vertex2(0, -1); //Bottom, Left

 

이렇게 해서도 테스트 해봅시다.

 

3-2. 서페이스에 색 넣기

각각의 버택스에 색을 지정하면 지정한 색이 자동으로 그라데이션되어 들어갑니다.

만약 한번만 지정하면 한색으로 나오게 되죠.

 

일단 코드를 보고 설명을 하겠습니다.

protected override void OnRenderFrame(FrameEventArgs e)
{
	base.OnRenderFrame(e);

	GL.Clear(ClearBufferMask.ColorBufferBit);
	GL.ClearColor(Color.CornflowerBlue);
			
	GL.Begin(PrimitiveType.Quads);

	GL.Color3(Color.Red);
	GL.Vertex2(0, 0);		//Top, Left
	GL.Color3(Color.Blue);
	GL.Vertex2(0.9f, 0);		//Top, Right
	GL.Color3(Color.Orange);
	GL.Vertex2(1, -0.9f);	//Bottom, Right
	GL.Color3(Color.Green);
	GL.Vertex2(0, -1);		//Bottom, Left

	GL.End();

	this.SwapBuffers();
}

 

이 코드를 실행하면 다음과 같이 나옵니다.

 

 

 

'GL.Color3(Color)'를 통해 버택스의 색을 지정했습니다.

여기서 'GL.Color3(Color)'가 나온 이후 뒤에 나오는 버택스는 'GL.Color3(Color)'가 지정한 색이 됩니다.

그러니 다음 버텍스를 찍기전에 'GL.Color3(Color)'를 하여 다른색을 지정하면 또 그 이후 나오는 버택스는 다시 지정한 색이 됩니다.

 

마무리

저도 3D그래픽 프로그래밍은 기초만 알기 때문에 상세한 설명은 힘듭니다 ㅡ.-;;;;;;

3D그래픽 프로그래밍에 관한 내용은 다양하게 많으니 별도로 검색해서 공부하시길 바랍니다.

 

OpenTK_Test.zip

 

 

  1. 이진태 2015.04.06 19:01  Address  Edit/Delete  Reply

    using System.Drawing; 참조가 있는데
    Color 이름이 현재 컨텍스트에 없습니다 라는 에러가 뜨네요
    이거 왜 그러는지 답변주시면 감사하겠습니다


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



    namespace OpenTKPlatformer
    {
    class Game : GameWindow
    {
    public Game(int width, int height)
    : base(width, height)
    {
    }

    protected override void OnLoad(EventArgs e)
    {
    base.OnLoad(e);
    }

    protected override void OnUpdateFrame(FrameEventArgs e)
    {
    base.OnUpdateFrame(e);
    }

    protected override void OnRenderFrame(FrameEventArgs e)
    {
    base.OnRenderFrame(e);

    GL.Clear(ClearBufferMask.ColorBufferBit);
    GL.ClearColor(Color.CornflowerBlue);


    this.SwapBuffers();
    }

    }



    }

    • Favicon of https://blog.danggun.net BlogIcon 당근천국 2015.04.06 19:35 신고  Address  Edit/Delete

      using System.Drawing;
      에 빨간줄 가있는지 확인 해주세요.

      'Color'에서 바인딩옵션에
      using System.Drawing;
      System.Drawing.Color
      이렇게 두개가 표시 되지 않는 다면 'using'만 되있는 거지 참조가 되있는게 아닙니다.
      솔루션 탐색기 > 참조에 'System.Drawing'가 있는지 확인해 주세요.

      제 기억으로는 'Color'이 'System.Drawing'이외에도 다른 곳에도 선언되어 있습니다.
      'System.Drawing'가 참조된 것인지 확인이 필요합니다.

  2. 이진태 2015.04.06 21:19  Address  Edit/Delete  Reply

    예 답변 정말 감사합니다
    제가 잠시 착각을 했습니다
    솔루션탐색기 참죠에 추가하지 안핬네요
    정말 감사합니다
    행복이 항상곁에 머믈기를 바랍니다

  3. Favicon of https://showmiso.tistory.com BlogIcon showmiso 2015.10.22 10:12 신고  Address  Edit/Delete  Reply

    C#으로 OpenGL을 배워보려고 OpenTK를 검색하다 들어왔습니다.
    C#은 하나도 몰랐는데 ㅠㅠ
    당근천국님 덕분에 진입이 쉬웠네요^^ 정말 감사합니다.~~

댓글 작성

이름
패스워드
홈페이지
비밀글