[OpenGL Tutorial] Displaying Points, Lines, Polygons

사용자 삽입 이미지OpenGL에서 화면상에 점과 선, 그리고 면을 그리는 것은 아주 쉽다. 그려주는 핵심적인 코드를 살펴보자. 먼저 코드를 살펴보기 전에 알고 있어야 할 것은 OpenGL의 좌표체계는 3차원 직각좌표를 기본으로 하고 있으며 왼쪽에서 오른쪽으로 그 X좌표의 값이 증가하며 아래에서 위쪽으로 Y좌표의 값이 증가한다. 그리고 모니터 화면의 바깓쪽으로 Z값이 증가한다는 점이다. 또한 폴리곤은 한마디로 안이 채워진 도형이며 면(Face)이라는 것이다


화면에 점을 그려주는 예

glBegin(GL_POINTS);
glVertex3f(0.0f, 0.0f, 0.0f);
glEnd();

화면에 선을 2개 그려주는 예

glBegin(GL_LINES);
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();

폴리곤을 그려주는 예

glBegin(GL_POLYGON);
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();

눈치가 빠른 독자라면 위에서 보인 세가지의 코드가 공통점이 있다는 것을 파악했을 것이다. 바로 glBegin과 glEnd라는 구문 안에 각 점들을 기술해줬다는 것이다. 점들을 기술하는 방법은 우리가 이미 알고 있는 3차원 직교 자표계로 쉽게 생각할 수 있다. 세번째인 폴리곤을 그려주는 예에서 4개의 점 좌표를 기술해 줬는데 종이를 준비해서 각 점을 종이에 순서대로 찍어보고 그 점을 순서 이어보자. 사각형이 그려질 것이다. 폴리곤이므로 처음 좌표와 마지막 좌표가 이어지게 되고 안은 지정된 색으로 채워지게 된다. 바로 이것이 좌표를 기술해 주는 방식이다. 간단하다.

그렇다면 이제 점을 그릴 것인지 선을 그릴것인지, 아니면 폴리곤을 그릴것인지 어떤 식으로 기술할 수 있는가. 역시 눈치 빠른 독자는 이미 그 방법을 위의 코드를 통해서 알것이다. 그렇다. 바로 glBegin이라는 함수를 통해 그 인자로 지시를 해주는 것이다. GL_POINTS는 점, GL_LINES는 선, GL_POLYGON은 폴리곤을 그려라는 의미이다. 이쯤이라면 위에서 제시한 3가지 코드에 대한 이해를 완벽하게 했으리라 믿어 의심치 않는다. 그래도 모르겠다면 필자에게 왜 이렇게 설명을 못하냐는 멜과 함께 뭐가 이해가 가지 않는지 멜을 가볍게 한통 던져주길 바란다.


여기서 끝마치면 너무 아쉽고 서운하다. 이 코드를 실제적으로 실습해봐야 할것이고 glBegin에 오는 인자가 더 있지나 않나하는 호기심을 품어야함이 옳다. 먼저 실습하는 방법에 대해서 알아보자. 필자는 이미 OpenGL을 초기화하는 과정을 튜어리얼 1번을 통해서 아주 길게 설명했다. 이 2번 튜어리얼은 1번에서 했던 코드를 그대로 사용한다. 먼저 1번 튜어리얼에서제작한 소스 코드를 살펴보면 DrawGLScane라는 함수가 있다. 바로 이 함수 안에서 그려주는 코드를 삽입하면 되겠다. 폴리곤을 그려주는 것으로 예를 들면 다음과 같다.

int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing
{
    // Clear Screen And Depth    Buffer
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); // Reset The Current Modelview Matrix
    glTranslatef(0.0f,0.0f,-10.0f);   // 추가된 코드 1
    glColor3f(1.0f, 1.0f, 1.0f);      // 추가된 코드 2
    glBegin(GL_POLYGON);              // 추가된 코드
    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; // Everything Went OK
} 

추가된 코드만을 코딩한후에 실행해 보자. 썰렁한 하얀 정사각형이 화면에 그려질 것이다. 하지만 우리가 그리고자 했던 것임은 틀림없다. 아닌가??

사용자 삽입 이미지

위의 코드를 더 살펴보자. 추가된 코드1과 2가 있는데 이것을 그냥 넘겨버리자니 이미 황폐해져 버린 필자의 마지막 남은 양심을 지킬 수가 없고 해서 설명해야겠다. 먼저 OpenGL은 처음에 초기화 과정에서 원점(0, 0, 0)을 화면의 정중앙에 맞추게 된다. 이 원점을 중심으로 OpenGL에서 그려지는 모든 것들을 바라보게 된다. 중요한 것이 바로 여기에 있다. 바로 원점에서 우리가 그린 사각형을 바라봐야 하는데 눈과 사각형이 겹치게 된다. 상상해 보라 독자의 눈과 책이 만날정도로 부착시키면 독자는 무었을 보게 되는가… 그렇다! 아무것도 보이지 않는다. 그래서 추가코드1이 필요한 것이다. 즉 물체를 눈의 위치보다 앞이나 뒤로 옮겨야 볼수 있는 것이다. 추가 코드1인 glTranslatef(0.0f, 0.0f, -10.0f)가 바로 그러한 일을 하는데 물체를 Z축으로 10.0f만큼 뒤로(-) 옮겨 그리라는 것이다. 이제 추가 코드2번에 대해서 살펴보도록 하자. 함수 이름에서 직감할 수 있듯이 그려줄 것에 대한 색을 지정하는 것이다. glColor3f는 세개의 인자를 갖는데 각각의 인자는 Red, Green, Blue 값이며 셋모두 하한값과 상한값이 0~1 사이를 갖는다. 이 정도면 나머지 것들도 실습하는데 별 어려움이 없을 것이다. 하지만 그 어떤 아쉬움이 남지 않는가….. 하지만 일단 그 아쉬움에 대해 후일을 기약하자.



이제 glBegin에 올수 있는 인자에 대해서 알아보도록 하자. 아래 그림으로 한방에 해결하고 마친다.

“[OpenGL Tutorial] Displaying Points, Lines, Polygons”에 대한 31개의 댓글

  1. OpenGL. 멋진 3차원 결과를 보면서 공부할 수 있는 재미있는 API입니다. 재밌게 즐기면서 하시면 좋은 성과가 있으리라 생각됩니다~

  2. 아… 잘보고 갑니다… CV로 영상처리를 하다가 갑자기 GL이라는 낮선 환경에 들어서다보니 이건 완전 2차원에 살다가 4차원 미지의 영역에 떨어진 느낌이였는데..
    잘보고 갑니다 ^^

  3. 이것 역시 잘봤습니다. D3D에 비해서 간단하고 보기좋아요~~제가 오픈쥐엘체질인가봐요 ㅎㅎ
    감사합니다.

    1. 말씀하신 점이 OpenGL의 장점이라고 하더군요. 그걸 직접 느끼셨다니.. 3D API에 대한 많은 경험을 가지고 계신듯합니다. 덧붙여 댓글 감사합니다.

  4. 첫번째 강의가 길어서 힘들었는데 이제 술술 풀릴까요? ^^; 좋은 자료 감사합니다. 이번 장은 쉽게 패스~ ㅎ

    1. 요즘 이래 저러 경황없이 바빠 댓글에 대한 감사의 글이 너무 늦었습니다. 첫번째 OpenGL 셋팅 내용이 너무 길었지만.. 이후 부터는 그에 비해 매우 짧답니다. 끝까지 화이팅 하시기 바랍니다!

  5. 이전에 그렇게 배워보려고 해서 이책저책 봐도 이해가 잘 안되는데 올려주신 튜토리얼은 정말~쉽게 잘 씌여졌네요..^^

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다