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

 

 

 

 



 

 

  1. Favicon of http://showmiso.tistory.com BlogIcon showmiso 2015.10.22 13:40 신고  Address  Edit/Delete  Reply

    한 Form에 glControl를 2개 올려볼려고 했는데
    ㅠㅠ
    왜 때문인지
    하나는 나오는데 하나는 안나오네요......

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2015.10.23 02:46 신고  Address  Edit/Delete

      여러개의 gl컨트롤을 각각 다른 화면으로 사용하시려면 화면을 갱신할때 'GLControl.MakeCurrent'를 호출 하셔야 합니다.
      http://www.opentk.com/node/850

    • Favicon of http://showmiso.tistory.com BlogIcon showmiso 2015.10.28 09:20 신고  Address  Edit/Delete

      답변 감사합니다.
      OpenTK에서는 glut를 쓸 수없어 결국 tao로 넘어갔네요 하하...
      수고하셔요/ㅅ /

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2015.10.30 12:02 신고  Address  Edit/Delete

      tao자체가 opentk로 변경되면서 glut기능들이 흡수되면서 대응되는 다른 명령으로 바뀐걸로 알고 있습니다.
      필요한 기능이 있다면이야 구버전이던 신버전이던 상관없긴 하지만 말이죠 ㅎㅎ
      수고하세요~

댓글 작성

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

티스토리 툴바