본문 바로가기

그래픽스 관련

(OpenGL) 간단한 코드(일부만 제시)와 부연 설명

윈도우창 나오는 그림들 출처는 네이버ID newpog 님의 블로그.
http://blog.naver.com/newpog/10002178727
(여기서 뷰포트에 대한 지식도 참고했음)


메인함수는 다음의 함수순으로 코딩.

void main( int argc, char** argv)
{ 
 void glutInit(int *argcp, char **argv); 
// GLUT 라이브러리를 초기화 한 후 윈도우 시스템과 세션을 연다.
 void glutInitDisplayMode(unsigned int mode); 
// 생성될 윈도우의 디스플레이 모드를 설정
 void glutInitWindowSize(int width, int height);
 // 윈도우 크기 설정 
 void glutCreateWindow(const char *tilte); 
// 새로운 윈도우 생성
 void glutDisplayFunc(void (*func)(void));
// 화면 디스플레이 이벤트가 발생 했을 시 실행되는 함수를 설정
 void glutReshapeFunc(void (*func)(int, int));
/* 윈도우 크기가 변경되었을 시 발생 했을 시 실행되는 함수를 설정
 여기 중간에 렌더링 상태를 설정하는 내용을 함수로 만들어 호출한다.
 내용에는 glClearColor 같은 지울 색을 설정하는 함수콜.*/
 glutMainLoop(); // 이벤트 루프로 진입하라는 함수 
}



glut 는 윈도우 운영체제의 좌표계를 따라 좌상단이 0,0 이며, 아래로 갈 수록 y좌표값은 양의 방향으로 증가 한다.


그리고 glutDisplayFunc 에 전달한 함수에서는 그리기 위한 코드를 정의 한다.

/*(실행결과가 위의 삼각형이라고 착각하면 ㄴㄴ)
*/
 glClear(GL_COLOR_BUFFER_BIT); /* glClearColor()를 통해 설정한 색으로 지운다. 인자에는 어떤 버퍼를 지울지 결정하는데, 여기에서 전달된 것은 색상버퍼이다. 즉 픽셀들의 색상정보를 가진 버퍼인데, 버퍼를 지운다는 것은 앞으로 그려질 화면을 지운다는 것과 비슷하다. 결국 효과는 2차원 화면을 설정한 색으로 지우는 것이 되겠다.*/
 glEnable(GL_LINE_STIPPLE); /*GL_LINE_STIPPLE에 해당하는 기능을 수행하게 된다. 물론 추가적인 함수콜이 필요한 기능들도 있다.*/ 
 glLineWidth(5); /*선의 두께, 수치가 클수록 두꺼워짐*/
 glLineStipple(10,0xcccc); /* LINE_STIPPLE 패턴을 정의 */
 glBegin(GL_LINE_LOOP);/*glbegin에서 glend로 그리고자 하는 대상 (primitive)하나 이상을 구성하는 vertex들을 하나로 묶는다.*/ 
 glColor3f(1,0,0); // 그릴 때 쓰이는 색깔을 정의 한다.
 glVertex2f(-50,-50); 
 glColor3f(0,1,0); /* 다른 값으로 호출함으로써 그릴 색깔을 갱신하고 있다. 지금은 glBegin에서 알 수 있는 바와 같이 선을 그리고 있는데, 이렇게 설정하면 점단위로 색이 매겨지고 점과 점을 있는 선의 색은 스펙트럼 같이 연속적으로 변화한다*/
glVertex2f(0,-50); 
glColor3f(0,0,1);
glVertex2f(0,0);
glColor3f(1,0,0);
glVertex2f(-50,0);
glEnd();
glDisable(GL_LINE_STIPPLE);
glFlush(); /*앞서 제출한  GL 명령들을 유한 시간내에  실행하도록 강제한다.*/
나머지코드는 제시 하지 않음

추가로 안나온  몇몇 함수에 대한 설명 

glPointSize(5);
/*그릴 점의 크기를 조정한다. 클수록 두꺼운*/
glLineWidth(5); /*그릴 선의 두께를 조정한다. 클수록 두꺼운*/
glPolygonMode(GL_FRONT_BACK,GL_LINE); /*그릴 도형 내부를 색칠하지않고 다각형으로 간주한다. 표현할 픽셀을 선으로 이어 그린다.*/


void glClear( GLbitfield   mask);
* glClear에 전달될 수 있는 인자들..
GL_COLOR_BUFFER_BIT
GL_DEPTH_BUFFER_BIT
GL_ACCUM_BUFFER_BIT
GL_STENSIL_BUFFER_BIT

 
void glMatrixMode( GLenum   mode);
어떤 매트릭스 스택이 후에 나오는 매트릭스연산 수행을 받을지 특정한다. 
인자는 GL_MODELVIEW, GL_PROJECTION, GL_TEXTUREㅡ, GL_COLOR ( ARB_imaging extension 지원시)
초기값은 GL_MODELVIEW. 인자는 각기 특정 매트릭스 스택을 가리킨다.


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

normalized device coordinates -> windows coordinate 의 아핀변환을 특정한다.  (xnd,ynd) -> (xw,yw) )

 

gl의 화면 좌표계는 윈도우 좌하단이 원점이며, 위로 갈수록 y좌표값이 양의 방향으로 증가한다.


원래의 뷰포트 설정을 바꾸게 되면 그에 비례하여 그려지는 모양도 늘어나거나 줄어든다.
아래 그림은 제일 위 그림에 적용된 뷰포트 사이즈 300,300 이 150,150 으로 바뀌고 나머지는 그대로 설정했을 때의 것이다.



void glLoadIdentity(   void);
현재매트릭스를 identity매트릭스로 바꾼다. glLoadMatrix를  identity 매트릭스로 호출한것과 동일 

아 귀찮아 ㄷㄷ;

void glOrtho(

GLdouble   left,
  GLdouble   right,
  GLdouble   bottom,
  GLdouble   top,
  GLdouble   nearVal,
  GLdouble   farVal);

glOrtho describes a transformation that produces a parallel projection. The current matrix (see glMatrixMode) is multiplied by this matrix and the result replaces the current matrix, as if glMultMatrix were called with the ( 왼 쪽  ) matrix as its argument:

Typically, the matrix mode is GL_PROJECTION, and (left,bottom,nearVal) and (right,top,nearVal) specify the points on the near clipping plane that are mapped to the lower left and upper right corners of the window, respectively, assuming that the eye is located at (0, 0, 0). farVal specifies the location of the far clipping plane. Both nearVal and farVal can be either positive or negative. Use glPushMatrix and glPopMatrix to save and restore the current matrix stack.
(간단하게  (left,bottom,-nearVal)이  윈도우의 좌하단 (가까운 평면), (right,top,-nearVal)이 윈도우의 우상단 (가까운 평면) 의 좌표가 되도록 윈도우에 좌표를 매핑한다는 뜻? 이 때 좌표는 ModelView에서 나오는 최종 좌표이고.. 해당좌표를 윈도우의 어디에 매핑 하는 것이 Projection 이라고 생각하면.. ㅇㅇ?)