우동우동우's note

[OpenGL] Study Note 3 : 나의 첫번째 OpenGL App In Window 본문

C & C++/OpenGL Study

[OpenGL] Study Note 3 : 나의 첫번째 OpenGL App In Window

우동우동우 2013. 11. 19. 07:40

지난번 Note에서는 Mac에서 OpenGL 예제를 컴파일 하는 것을 구현해보았다. 

이번 Note는 윈도우 환경에서 구현을 하는 예제를 보여주겠다. 

지난번 컴파일러에는 Visual Studio 2010 과 Dev-C++ 로 2가지가 있다고 얘기하였다. 

이번 예제에서는 이 두가지를 활용하여 프로젝트를 구성하고 개발하는 예제를 보여주도록 하겠다. 


Visual Studio 2010 

일반적으로 윈도우 어플을 개발할 때면 Visual Studio를 활용함으로 이번 예제만 Visuall Studio를 활용하여 OpenGL 셋팅하는 방법을 보여주도록 하겠다.


1. 새 프로젝트를 만든다. 

여기서 Win32 프로젝트를 선택한다. 

그리고 프로젝트 이름은 MyFirstApp으로 한다. 


2. 다음!


3. 빈프로젝트 선택 후 마침을 클릭!


4. main.cpp파일 생성

우선 코드는 아래에 나와있는 코드를 넣으면 된다. 

그러고 컴파일을 해보자 그러면 검은 화면에 삼각형이 나타날 것이다. 그러면 끝이다. ㅎㅎ 참 쉽죠?!

main.cpp

#include <windows.h>
#include <gl/glut.h>

void onDisplay(void);

void onDisplay(void)
{
	// 화면 리셋
	glClear(GL_COLOR_BUFFER_BIT);
    
	// 삼각형 그리기 시작
	glBegin(GL_TRIANGLES);
    
	// 모서리 지정
	glVertex2f(0.0, 0.5);
	glVertex2f(-0.5, -0.5);
	glVertex2f(0.5, -0.5);
    
	// 삼각형 그리기 종료
	glEnd();
    
	// flush
	glFlush();
}
 
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
       ,LPSTR lpszCmdParam,int nCmdShow)
{
	glutCreateWindow("My First App"); // 윈도우 만들기
	glutDisplayFunc(onDisplay); // 디스플레이 함수 설정해주기
	glutMainLoop(); // 시작하기
	return 0;
}

main.cpp



Dev-C++

Visual Studio 2010을 사용해서 예제를 컴파일을 해보았다. 그리고 이번에는 Dev-C++를 활용해서 예제를 컴파일 해보자. 


1. 새 프로젝트 생성

Window Application을 선택하고 프로젝트 명을 MyFirstApp으로 입력한다. 그리고 확인!


2. main.cpp 작성. 

Dev-C++생성을 하면 main.cpp파일에 내용이 채워져 있을 것이다. 우선 이 내용을 지우고 위에 있는 main.cpp 의 내용을 복사해서 넣으면 된다. 이 상태에서 컴파일을 하면 컴파일 에러가 나타날 것이다. 이는 몇몇 라이브러리가 포함이 되지 않아서 발생하는 에러이다. 


3. 라이브러리 링크 추가하기 


프로젝트 옵션에서 매개변수에 아래와 같이 링커에 추가해주면 된다. 


자 이제 컴파일을 해보시길.. 

이제 소스에 대해서 알아보자. 

main.cpp 소스 분석

WinMain 함수

	glutCreateWindow("My First App"); // 윈도우 만들기
	glutDisplayFunc(onDisplay); // 디스플레이 함수 설정해주기
	glutMainLoop(); // 시작하기
	return 0;


위 내용은 WinMain함수 내부에 선언된 것이다. 

  • glutCreateWindow() 함수는 최상위 창을 생성하는 함수로 파라미터로는 char * name을 받는다. name파라미터는 최상위 창의 이름을 나타내게 된다. 
  • glutDisplayFunc() 함수는 Display Callback 함수를 나타낸다. 파라미터로는 함수의 포인터를 넣어주면 된다. 
  • glutMainLoop() 함수는 glut main loop 로 들어가는 함수 이다. 

사실 glut는 OpenGL 라이브러리를 학습하기 편하게 하는 라이브러리로 필요한 API에 대해서는 각각 찾아보면 될 것이다. 레퍼런스 문서는 다음의 링크를 가면 내용을 볼 수 있다. [http://www.opengl.org/documentation/specs/glut/spec3/node1.html]

이제 Display를 하는 onDisPlay함수에 대해서 살펴보자. 

onDisplay 함수 

void onDisplay(void) { // 화면 리셋 glClear(GL_COLOR_BUFFER_BIT); // 삼각형 그리기 시작 glBegin(GL_TRIANGLES); // 모서리 지정 glVertex2f(0.0, 0.5); glVertex2f(-0.5, -0.5); glVertex2f(0.5, -0.5); // 삼각형 그리기 종료 glEnd(); // flush glFlush(); }

이번 예제에서는 onDisplay함수에서 화면을 그리는 로직을 구현해놓았다. 

우선 Reference 문서의 위치는 다음과 같다. [http://www.opengl.org/sdk/docs/man/] 여기서 필요한 OpenGL의 라이브러리의 사용방법을 확인할 수 있다. 문서를 확인해보면 생각보다 적다. OpenGL의 라이브러리가 API의 양이 방대할 것으로 생각했었는데 생각보다 적어서 조금 놀래기도 했다. 쩝. 잘 만들면 이렇게 적은 양(약 250개)의 API 만으로도 그 많은 프로그램들이 개발이 된것을 보면 참 신기하다. 

자 이제 공부를 해보자. 

함수를 하나 씩 확인해보자. 

  • glClear() : 화면 버퍼를 정해진 값으로 초기화하는 함수이다. 여기의 파라미터로는 GLbitfield mask가 있다. mask 파라미터는 원하는 bit를 초기화하는 것을 말한다. mask의 값으로는 GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT 이렇게 3가지가 있다. 일단은 이런 값이 있다는 것을 알고 넘어가면 될 것 같다. 나중에 각 함수별로 상세히 알아보는 포스팅을 할 예정이다. 
    • GL_COLOR_BUFFER_BIT
    • GL_DEPTH_BUFFER_BIT
    • GL_STENCIL_BUFFER_BIT 
  • glBegin() : 이 함수는 OpenGL 2.x 버전까지 존재하며 3.x 부터 사라진 것 같다. 쩝.. 시중에 나와있는 예제를 보고 만들다 보니.. 이런 내용을 포함 하게되었다. 해당 포스팅에 대한 내용은 Stack OverFlow에서 다뤄진 이슈인 것 같다. 참고하자. 일단 glBegin은 특정 도형을 그릴 때 시작을 한다는 것을 알려주고 파라미터로 어떤 모양인지(GLenum  mode)에 대한 것을 넣게 된다. 본 예제에서는 GL_TRIANGLES를 사용하여 삼각형을 그린다고 하였다. 
  • glEnd() : glBegin과 같이 3.x 버전부터 삭제된 함수이다. 우선 glBegin을 마친다는 함수이다. 
  • glFlush() : 입력된 GL명령어들을 강제적으로 수행하는 함수이다. 이 함수가 불려져야 화면에 표시되니 빠뜨리지 말자. 
  • glVertex() : glBegin에서 정의한 모양의 꼭지점을 찍는다고 생각을 하면 될것 같다. 이번 예제에서 (0, 0.5), (-0.5, 0.5), (-0.5, -0.5)이렇게 3개의 점을 정의하였다. 삼각형이 그려지려면 3개의 점이 필요하니 말이다. 

우선 간단하게 도형을 그리는 함수들을 파악하였다. 예제를 만들고 나서 자료를 찾아보니 deprecated된 함수를 사용하기도 하였고, 조금 모르는 정확하게 알지 못한 것 같다. 포스팅된 내용중에 잘못 된 것이 있으면 뎃글로 남겨주시면 수정하도록 하겠다. 

그리고 이제부터는 deprecated된 함수를 가급적이면 사용하지 않고 구현을 할 예정이다. 
첫 예제에서 부터 삐걱 거려 좀 아쉽기도 하다. 
이제 본격적으로 진행하려한다. 우선 2D 도형을 그리는 방법을 알아볼 것이고, 2D 도형들을 활용하여 간단한 게임을 표현해보자 한다. 그리고 나서 3D 도형을 만드는 것들을 추가적으로 공부하고자 한다. 또, OpenGL의 도형을 그리면서 내부적인 루프를 활용하는 방법들에 대한 것들도 같이 포스팅하겠다.
OpenGL이 기하학적인 모형을 표현하는 도구로 사용되다 보니 수학적인 것들을 알아야 할 것 같다. 공부를 하면서 알게되는 내용들은 이곳에 같이 포스팅하도록 하겠다. 

마지막으로 이제 기본적 셋팅에 대한 내용은 포스팅하지 않을 예정이다. 일단 현재 사용하고 있는 glut만으로 충분히 학습하는데는 이상이 없다고 한다. 나중에 필요시 추가적으로 내용에 살을 붙이도록 하겠다. 


Comments