유튜브에 올라와있는 'OpenTK' 플랫폼 튜토리얼을 따라하는 포스팅입니다.
'OpenTK'는 'OpenGL', 'OpenCL', 'OpenAL'가 합쳐진 C#랩퍼입니다.
OpenTK Platformer Tutorial: Part 1 - Clearing and Drawing in our Custom Game Class
게임(Game) 클래스를 만들어 화면을 초기화(Clearing)하고 서페이스(surface)를 그리는 방법.
프로젝트에 '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();
}
}
'OpenGL'을 컨트롤 하기위해 'OpenTK'에서는 'GL'을 제공합니다.
'using OpenTK.Graphics.OpenGL;'를 유징하면 별도의 인스턴스 없이 사용이 가능합니다.
화면을 새로 그리려고 할때 'OnRenderFrame'이 발생하므로 'OnRenderFrame'에서 처리하면 됩니다.
'GL.Clear(ClearBufferMask);'를 사용하여 화면을 비울 수 있습니다.
이렇게 비워진 화면을 표시하기위해 'GameWindow.SwapBuffers();'를 이용합니다.
protected override void OnRenderFrame(FrameEventArgs e)
{
base.OnRenderFrame(e);
GL.Clear(ClearBufferMask.ColorBufferBit);
this.SwapBuffers();
}
테스트 해봅시다.
이제 화면이 초기화가 되서 검정색으로 보입니다.
화면을 초기화할때 색을 넣기위해 '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();
}
이제 테스트해봅시다.
하늘색으로 화면이 초기화 되었습니다.
3D공간에 모델을 만들기위한 꼭지점을 버택스(vertex)라고 하고 이 꼭지점을 이어서 만든 것을 서페이스(surface, 표면)이라고 합니다.
이것은 3D프로그래밍을 할때 항상나오는 것이라 자세한 내용은 다른 곳에서 찾으시면 됩니다.
그러고보니 보통 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
이렇게 해서도 테스트 해봅시다.
각각의 버택스에 색을 지정하면 지정한 색이 자동으로 그라데이션되어 들어갑니다.
만약 한번만 지정하면 한색으로 나오게 되죠.
일단 코드를 보고 설명을 하겠습니다.
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그래픽 프로그래밍에 관한 내용은 다양하게 많으니 별도로 검색해서 공부하시길 바랍니다.