2015. 6. 23. 15:00

GDI+로 짧은 시간에 처리되는 그래프를 그리니까 개수가 늘어날 때마다 버벅거리는 게 너무 심해져서 OpenTK를 이용해볼까 해서 찾은 자료입니다.

 

참고 : OpenTK - Building a Windows.Forms + GLControl based application

 

 

 
1. 'OpenTK' 컨트롤 추가 하기

OpenTK에서는 윈폼(Winform)에서 사용이 가능하도록 컨트롤을 제공하고 있습니다.

'도구 상자'에 구성요소를 추가해 봅시다.

 

1. 도구 상자의 빈 곳에서 오른쪽 클릭을 하고 '항목 선택'을 선택합니다.

2. '.NET Framework 구성 요소'에서 찾아보기를 누릅니다.

3. 다운로드한 OpneTK 라이브러리에서 'OpenTK.GLControl.dll'를 찾습니다.

4. 해당 파일을 엽니다.

5. '.NET Framework 구성 요소'에 추가된 'GLContorl'을 찾아 추가합니다.

 

 

이제 도구 상자를 보면 'GLControl'이 추가되었습니다.

윈폼에 컨트롤을 추가하면 준비 끝!

 

2. 'GLControl' 초기화 하기

이제 그냥 실행해 보면 'GLControl'의 영역이 초기화되지 않아 배경이 투영되는 현상이 있습니다.

(참고 : [C#, OpenTK] OpenTK Platformer Tutorials: Part 0 - OpenTK 참조하기 )

 

이 부분부터는 이전에 작성한 OpenTK와 같습니다.

 

추가한 'glControl1' 컨트롤에 다음 이벤트를 연결합니다.

(컨트롤을 선택하고 속성 창에서 '이벤트'를 선택하고 해당 이벤트들을 추가합니다.)

glControl1_Load

glControl1_Resize

glControl1_Paint

 

그리고 폼에 'bool loaded'를 추가하고 다음과 같이 이벤트에 코드를 추가합니다.

using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;

namespace OpenTK_Winform
{
	public partial class Form1 : Form
	{
		bool loaded = false;

		public Form1()
		{
			InitializeComponent();
		}

		private void glControl1_Load(object sender, EventArgs e)
		{
			this.loaded = true;
		}

		private void glControl1_Resize(object sender, EventArgs e)
		{
			if (false == this.loaded)
			{
				return;
			}
		}

		private void glControl1_Paint(object sender, PaintEventArgs e)
		{
			if (false == this.loaded)
			{
				return;
			}

			GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
			glControl1.SwapBuffers();
		}
        
	}
}

 

이제 실행해보면 화면이 클리어 되고 있는걸 알 수 있습니다.

 

 

 

3. 화면에 그리기

이제부터는 OpenTK의 와 같은 방법으로 다루면 되기 때문에 따로 설명은 하지 않겠습니다.

private void glControl1_Load(object sender, EventArgs e)
{
	this.loaded = true;
	GL.ClearColor(Color.SkyBlue);
	this.SetupViewport();
}

private void glControl1_Paint(object sender, PaintEventArgs e)
{
	if (false == this.loaded)
	{
		return;
	}

	GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

	GL.MatrixMode(MatrixMode.Modelview);
	GL.LoadIdentity();
	GL.Color3(Color.Yellow);
	GL.Begin(BeginMode.Triangles);
	GL.Vertex2(10, 20);
	GL.Vertex2(100, 20);
	GL.Vertex2(100, 50);
	GL.End();

	glControl1.SwapBuffers();
}

private void SetupViewport()
{
	int w = glControl1.Width;
	int h = glControl1.Height;
	GL.MatrixMode(MatrixMode.Projection);
	GL.LoadIdentity();
	GL.Ortho(0, w, 0, h, -1, 1); // Bottom-left corner pixel has coordinate (0, 0)
	GL.Viewport(0, 0, w, h); // Use all of the glControl painting area
}

 

이렇게 코드를 추가하면 화면에 삼각형이 그려집니다.

 

 

 

4. 사각형 그리기

이제 OpenTK 튜토리얼에서 했던 사각형 그리기를 해봅시다.

(참고 : [C#.Net, OpenTK] OpenTK Platformer Tutorials: Part 1 - 클리어링과 드로잉그리고 커스텀 게임 클래스)

 

삼각형 그리던 코드에서 'GL.Begin(BeginMode.Triangles);'을 'GL.Begin(PrimitiveType.Quads);'로 바꾼 후 버택스코드를 아래와 같이 수정합니다.

GL.Begin(PrimitiveType.Quads);

GL.Vertex2(10, 10);//Top, Left
GL.Vertex2(100, 10);//Top, Right
GL.Vertex2(100, 100);//Bottom, Right
GL.Vertex2(10, 100);//Bottom, Left
			
GL.End();

 

이제 사각형이 그려지는 걸 볼 수 있습니다.

 

마무리

OpenTK는 윈폼관련한 편의 기능을 제공해주니 다행이네요.

이런 것들을 지원하지 않아도 사용방법은 있겠지만 편리함이 다르니 말이죠 ㅎㅎㅎ

 

프로젝트 파일입니다.

OpenTK_Winform.zip
다운로드