728x90
반응형
OpenGL 사각형그리기 예제2

소스코드

#include <stdlib.h>
#include <GL/glut.h>
#include <GL/GL.h>
#include <GL/GLU.h>

void MyDisplay(){
	glClear(GL_COLOR_BUFFER_BIT); // GL상태변수 설정, 프레임 버퍼를 초기화
									// 초기화 될 색은 glutClearColor에서 사용된 색
	glViewport(0, 0, 300, 300); 
	glColor3f(1.0, 1.0, 1.0); // 
	glBegin(GL_POLYGON); // 입력요소 기본정의
	glVertex3f(-0.5, -0.5, 0.0);
	glVertex3f(0.5, -0.5, 0.0);
	glVertex3f(0.5, 0.5, 0.0);
	glVertex3f(-0.5, 0.5, 0.0);
	glEnd();
	glFlush();
}
int main(int argc, char** argv){
	glutInit(&argc, argv); // GLUT 윈도우 함수
	glutInitDisplayMode(GLUT_RGB); // 윈도우 의 기본컬러모드를 RGB모드로 설정
	glutInitWindowSize(300, 300); // 윈도우 사이즈 설정
	glutInitWindowPosition(0, 0); // 윈도우 창 위치 설정
	glutCreateWindow("OpenGL example");
	glClearColor(0.0, 0.0, 0.0, 1.0); // GL 상태변수 설정, 마지막 알파값은 1이면 불투명 0이면 투명 
	glMatrixMode(GL_PROJECTION); // 
	glLoadIdentity();
	glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
	glutDisplayFunc(MyDisplay); // GLUT 콜백함수 등록
	glutMainLoop(); // 이벤트 루프 진입
	return 0;
}


소스설명


저번에 포스팅하였던 OpenGL 간단한 사각형 그리기 예제는 소스코드의 길이가 비교적 짧았다. 왜냐하면 기본상태변수를 적용하였고 이번 사각형그리기 예제는 GLUT 상태변수를 설정하는 명령을 모두 담고있다.


지엘의 뷰포트 설정하는 부분을 자세히 살펴보자면


glViewport(x, y, width, height) 함수에 의해 설정되는데 여기서 x와 y는 윈도우 뷰포트원점에서의 x,y 거리를 뜻하고 width와 height는 그리고자하는 폴리곤의 너비와 높이를 뜻한다.


여기서 주의할 점은 GLUT가 사용하는 화면 좌표계와 GL이 사용하는 화면 좌표계가 서로 다르다는 점이다.

GLUT가 사용하는 화면 좌표계는 화면 좌상단을 원점(0,0)으로 하며 GL이 사용하는 화면 좌표계는 화면 좌하단을 원점으로 삼는다.


따라서 GLUT는 일반적인 윈도우 운영체제의 화면 좌표계를 따르지만 GL은 그렇지 않다는 것에 유의한다.

GL은 우리가 수학에서 배운 2차원 좌표축과 동일한 좌표계를 따르는데, 좌표계 사용을 용이하게 하려는 의도가 있다.


따라서 지엘의 뷰포트는 glViewport() 함수에 의해 설정되고  위 코드에서 glViewport(0,0,300,300) 으로 선언함으로써 glutInitWindowSize(300,300)에 의해 설정된 윈도우 전체를 하나의 뷰포트로 취급하려는 것이다. 


윈도우사이즈가 300,300으로 설정되어있는데 뷰포트를 150,150으로 바꾸고, 300,150으로 바꾼 결과는 각각 아래와 같다






만일 glViewport 함수를 이용해서 뷰 포트를 별도로 설정하지 않으면 뷰포트는 항상 자동적으로 현재 윈도우와 일치하게 된다 따라서 프로그램이 시작하는 순간의 뷰포트는 자동적으로 현재 윈도우와 일치하게 되지만, 사용자가 프로그램 실행 중 윈도우 크기를 변경하면 그 즉시 뷰포트는 변경한 윈도우와 일치하게된다.


그러나 뷰포트를 별도로 설정하지 않은 상태에서 윈도우 크기 조절에 따라 뷰포트가 변하고 그 결과 변한 뷰포트에 맞추어 물체가 왜곡된다. 이러한 바람직한 현상을 피하기 위해선 사용자의 운도우 크기 조절 행위에 동적으로 대응하는 콜백함수가 필요하다. (동적으로 대응하는 콜백함수는 다음 포스팅 참조 - 리셰이프콜백)


아래 왼쪽 예시는 뷰포트를 설정하지 않은 상태에서 사용자가 윈도우 크기를 조절한 화면이고, 아래 오른쪽 예시는 뷰포트를 설정한 상태에서 사용자가 윈도우 크기를 조절한 화면이다.









728x90
반응형