'도형그리기'에 해당되는 글 1건

  1. 2012.10.28 도형그리기

도형그리기

Developer/OpenGL 2012. 10. 28. 01:07

#include <Windows.h>

#include <gl/GL.H>

#include <gl/GLU.H>

#include <gl/glut.h>

 

void RenderScene(void) {

      glClear(GL_COLOR_BUFFER_BIT);

      glColor3f(1.0f, 0.0f, 0.0f);             //드로잉 색상을 적색으로 설정

      glRectf(-25.0f, 25.0f, 25.0f, -25.0f);   //현재 드로잉 색상으로 사각형을 그림

      glFlush();

}

 

void SetupRC(void) {    //렌더링 상태를 설정

      glClearColor(0.0f, 0.0f, 1.0f, 1.0f);

}

 

//창의 크기가 변할때 GLUT에 의해 호출될 함수

void ChangeSize(GLsizei w, GLsizei h) {

 

      GLfloat aspectRatio;

 

      if(h==0)

            h=1;

 

      glViewport(0, 0, w, h); //뷰포트를 창의 크기에 맞게 설정

 

      //좌표계 초기화

      glMatrixMode(GL_PROJECTION);

      glLoadIdentity();

 

      //클리핑 영역설정

      aspectRatio=(GLfloat)w/(GLfloat)h;

      if(w<=h)

            glOrtho(-100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio, 1.0, -1.0);

      else

            glOrtho(-100 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0);

 

      glMatrixMode(GL_MODELVIEW);

      glLoadIdentity();

}

 

 

int main(void) {

      glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

      glutCreateWindow("GLRect");

      glutDisplayFunc(RenderScene);

      glutReshapeFunc(ChangeSize); //window의 크기가 변경될때 호출되는 함수를 등록 

      SetupRC();

      glutMainLoop();

      return 0;

}

 

void glColor3f(GLfloat red, GLfloat green, GLfloat blue);

void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);

glColor3f함수는 드로잉을할 색상을 설정하는데 RGB값만 전달하고 알파값은 저장할 필요가없다.

glRectf함수는 실수인자 4개를 받는데 x1, y1은 사각형의 좌측상단 좌표, x2, y2는 사각형의 우측하단의 좌표를 의미한다.

 

void glutReshapeFunc(void (*func)(int width, int height));

void ChangeSize(GLsizei w, GLsizei h);

창의 크기가 변하면 뷰포트와 클리핑영역이 다시 설정되여야만 한다. 따라서 GLUT라이브러리는 glutReshapeFunc라는 함수를 통해 창의크기가 변할때마다 GLUT라이브러리가 호출할 콜백을 등록할수 있도록한다. 즉, glutReshapeFunc에 함수를 등록해두면 창의 크기가 변할 때마다 실행된다. 위 코드에서는ChangeSize라는 함수를 만들어 콜백함수로 등록한다.

ChangeSize함수는 새로운 창의 너비와 높이를 받아 좌표계와 화면의 좌표의 매핑에 사용되는데, 이때 glViewport와 glOrtho라는 두개의 OpenGL함수가 쓰인다.

 

void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);

x, y인자는 창내에 위치하는 뷰포트 최하단의 좌표를 의마하며, 너비(width)와 높이(height) 인자는 각각 뷰포트의 너비와 높이를 의미한다. 뷰포트의 설정이 끝나면 OpenGL이 실제로 그림을 그려 넣을 공간이 지정되고, 현재 클리핑 영역이 이 공간에 맵핑된다.

 

void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);

ChangeSize함수가 해야하는 작업은 클리핑 영역을 조정하여 종횡비가 맞는 정사각형으로 만드는 일이다. 이말은 즉 창의 크기를 정사각형에서 직사각형형태로 바꾸더라도 glRectf을통해 그려진 사각형의 모양을 그대로 유지할수 있도록 하는것이다.

left와 right는 x축의 최소값과 최대값을, bottom과 top은 y축의 최소값과 최대값을, near와 far는 z축의 최소값과 최대값을 각각 의미한다. z축의 경우는 값이 작아질수록 관측자로부터 멀어짐을 의마한다는것을 주의해야한다.

 

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glMartixMode함수는 투영을 위한 행렬을 하는 부분이다. glLoadIdentity는 행렬처리가 이뤄지기전에 좌표를 초기화 하는 역할을 한다.

 

 출력결과

 

 

 

 

 

 

 

'Developer > OpenGL' 카테고리의 다른 글

좌표체계(Clipping, Viewport)  (0) 2012.10.28
OpenGL이란?  (0) 2012.10.24
Posted by No names
,