[App 개발] NeHe Lesson 2
본문
***
첫 번째 예제에서는 어떻게 OpenGL 윈도우를 만드는지를 살펴보았습니다. 이번에는 GL_TRIANGLES와 GL_QUADS를 이용하여 화면에 삼각형과 사각형을 그리는 방법을 살펴볼 것입니다.
첫 번째 강의 코드에 DrawGLScene()함수를 변경하는 과정을 밑에 기록할 것입니다. 지난 강의의 코드에 이 함수와 밑에 있는 코드를 변경하시면 됩니다.
int DrawGLScene(GLvoid) // 우리가 그림을 그릴 함수
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 화면과 depth buffer를 지운다
glLoadIdentity(); // 좌표를 화면의 중앙으로
glLoadIdentity()를 호출하면 좌표는 화면의 중앙으로 옮겨지며, x축은 왼쪽에서 오른쪽으로, y축은 아래에서 위로, z축은 화면 중앙에서 보는 사람으로 가까와지는 쪽으로 증가합니다. 화면 중앙이 x-y축의 0.0f입니다. 따라서 화면 왼쪽의 좌표는 음수, 오른쪽은 양수, 화면 아래쪽은 음수, 위쪽은 양수, 그리고 화면 깊숙히 들어갈 수록 음수, 보는사람 쪽으로 올수록 양수입니다.
glTranslatef( x, y, z )함수는 축을 x, y, z 방향으로 움직입니다. 밑에 있는 코드는 x축을 1.5유닛, y축으로는 움직이지 않고, 화면 안쪽으로 6 유닛 움직입니다. 이동할 때의 숫자는 중앙으로부터 얼마나 이동하는 것인가를 나타내는 것이 아니라, 현재 있는 장소에서 얼마나 움직일 것인가를 나타내는 상대적인 값입니다.
glTranslatef(-1.5f,0.0f,-6.0f); // 왼쪽으로 1.5, 화면 안쪽으로 6.0만큼 움직인다
이제 우리는 화면 왼쪽으로 안쪽 깊숙히 이동하여 삼각형의 전체를 다 볼 수 있도록 그릴 것입니다. glBegin(GL_TRIANGLES)함수는 삼각형을 그리기 시작할 때, glEnd()는 삼각형을 다 그렸다는 신호를 OpenGL에게 보내는 것입니다. 일반적으로 3점을 이용한 평면을 그릴 때 GL_TRIANGLES를 이용합니다. 대부분의 비디오카드에서 삼각형을 빠르게 그릴 수 있습니다. 4점 평면을 그릴 때에는 간편하게 GL_QUADS를 이용합니다. 하지만 대부분 비디오카드들은 어짜피 사각형이라도 삼각형의 조합으로 그림을 그리게 됩니다. 만약 4점 이상의 다각형을 그리고 싶을 때에는 GL_POLYGON을 이용합니다.
우리 간단한 프로그램에서는 삼각형 하나만 그립니다. 만약 삼각형을 하나 더 그리고 싶다면 프로그램 처음 세 줄 밑에 따로 세 줄을 첨가하여, 모두 여섯 줄의 프로그램이 glBegin(GL_TRIANGLES)와 glEnd()사이에 놓이게 하면 됩니다. 프로그램 세 줄마다 계속해서 glBegin()과 glEnd()를 호출하여야 할 필요는 없습니다. 사각형 그리는 것도 마찬가지입니다. 만약 몽땅 사각형만 그리고 싶다면 처음의 네 줄 다음에 계속해서 네 줄짜리 코드를 첨가하기만 하면 됩니다. 한편 다각형의 경우(GL_POLYGON)는 놓여있는 점을 모두 이용하기 때문에 glBegin(GL_POLYGON)과 glEnd()사이에 몇 줄이 놓여있건 상관이 없습니다.
glBegin()함수 다음의 첫 번째 줄이 다각형의 첫 번째 점입니다. 첫 번째 숫자가 x축, 두 번째 숫자가 y축, 세 번째 숫자가 z축의 값입니다. 따라서 첫 번째 줄에서는 x축으로 이동이 없이 y축으로 1유닛 움직이고, z축으로도 움직이지 않습니다. 이것이 삼각형의 맨 위쪽 꼭지점입니다. 두 번째 줄에서는 x축에서 왼쪽으로 1 유닛, y축으로 밑으로 1유닛 움직입니다. 이것이 삼각형의 왼쪽 꼭지점입니다. 세 번째 줄에서는 오른쪽으로 1유닛, 아래쪽으로 1유닛 움직여서 오른쪽 꼭지점을 만듭니다. OpenGL에서는 glEnd()함수를 만남으로써 더 이상 그릴 점이 없다는 것을 알게 됩니다. 이제 속이 채워진 삼각형이 출력될 것입니다.
glBegin(GL_TRIANGLES); // 삼각형을 그리기 시작
glVertex3f( 0.0f, 1.0f, 0.0f); // 위
glVertex3f(-1.0f,-1.0f, 0.0f); // 왼쪽 아래
glVertex3f( 1.0f,-1.0f, 0.0f); // 오른쪽 아래
glEnd(); // 삼각형 그리기 끝
지금까지 왼쪽 화면에 삼각형을 그렸고, 이제부터는 오른쪽에 사각형을 만들 차례입니다. 먼저 glTranslate()함수를 다시 호출합니다. 오른쪽으로 축을 이동할 것이기 때문에 x축 값이 양수가 되어야 합니다. 우리는 이미 중앙에서 왼쪽으로 1.5유닛 이동한 상태이기 때문에 다시 중앙으로 돌아가기 위해서는 오른쪽으로 1.5유닛 이동해야 합니다. 그 다음 오른쪽 화면으로 가기 위해서 다시 1.5유닛을 이동할 것입니다. 따라서 우리는 전부 3.0유닛 오른쪽으로 이동해야 합니다.
glTranslatef(3.0f,0.0f,0.0f); // 오른쪽으로 3유닛 이동
이제 GL_QUADS를 이용하여 사각형을 그려보겠습니다. 사각형은 기본적으로 네 면을 가진 다각형입니다. 정사각형을 만들기에 딱 좋겠습니다. 정사각형을 만드는 방법은 삼각형 만드는 코드와 아주 유사합니다. 한 가지 차이점은 GL_TRIANGLES대신 GL_QUADS를 쓴다는 점, 그리고 3점 대신 4점을 이용한다는 점이 다릅니다. 이제 사각형을 왼쪽 위, 오른쪽 위, 오른쪽 아래, 왼쪽 아래, 시계 방향으로 그려 나가겠습니다. 시계방향으로 그리게 되기 때문에 우리는 실제로 정사각형의 반대쪽 면을 보게 됩니다. (다각형 그리는 방향에 따라서 면의 앞뒤가 바뀝니다.) 사각형의 뒤쪽 면을 보는 셈입니다. 반시계방향으로 그리면 정면이 앞쪽으로 오게 됩니다. 지금은 그것이 중요하지 않지만, 나중에 가서는 반드시 고려해야 할 사항입니다.
glBegin(GL_QUADS); // 사각형 그리기 시작
glVertex3f(-1.0f, 1.0f, 0.0f); // 왼쪽 위
glVertex3f( 1.0f, 1.0f, 0.0f); // 오른쪽 위
glVertex3f( 1.0f,-1.0f, 0.0f); // 오른쪽 아래
glVertex3f(-1.0f,-1.0f, 0.0f); // 왼쪽 아래
glEnd(); // 사각형 그리기 끝
return TRUE; // 그리기를 계속 한다
***
번역이 잘못되었다든지 이상한 것은 알려주시면 정정하겠습니다. 실행화면과 소스를 올립니다. Lesson 1에서 다루었어야 하는 부분 중에서 빠진 코드는 이 소스를 보시고 채워 넣으시면 되겠습니다. 그리고 원래 NeHe Lesson 2 에는 키보드 입력 핸들러도 구현하는데, 제 소스에서는 생략했습니다. 나중에 다루어질 것입니다. ^^
최신글이 없습니다.
최신글이 없습니다.
댓글목록 0