2015. 1. 24. 15:00

유튜브에 올라와있는 '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
다운로드