본문 바로가기

Graphics

[GLUT/openGL] glViewport 함수

glutReshapeFunc(reshape)

실습자료의 코드를 읽다가 glViewport 함수를 발견하였다. 

이 함수가 대체 어떤 기능을 하는지 알아보는 과정에서 새로 알게된 용어들도 함께 정리해보려 한다.

 

viewport 란 일단.. 컴퓨터, 휴대폰 등의 장치에서 사용자에게 보이는 부분을 말한다.

glutCreateWindow로 만들어낸 window와는 다른 것이다.

 

이때 glut와 openGL을 단계적으로 구분하는 과정에서 두 종류의 원점이 다른 좌표계가 등장한다.

window를 만드는 glut 는 왼쪽 상단이 원점,
만들어진 window에 그림을 그리는 openGL 은 왼쪽 하단이 원점이다.

우선 glut에 의해 window가 만들어질 것이다.

만약 glViewport를 만나지 않으면 window와 viewport는 자동으로 일치된다.

실행 도중 window의 크기를 변경하여도 viewport는 바뀐 winodw와 일치하도록 설정되어 있다.

 

하지만 glViewport함수를 만나면, 이미 존재하는 window와 별개로 viewport가 설정된다.

타이틀 바가 달린 window랑은 별개로, 우리 openGL은 이 viewport에만 그림 그릴거임~ 하는 식이다.

ex)

참고로 glViewport(x, y, width, height)의 파라미터는 각각 다음과 같다.

x, y는 viewport의 왼쪽 아래 픽셀의 좌표다.

width, height는 viewport의 너비와 높이이다. 

 

자 그러면 glViewport 함수는 왜 있는 걸까?

위의 ex)에서도 굳이 glViewport를 추가하는 바람에 삼각형이 치우치기나 했다.

glViewport의 필요성은 프로그램 실행 도중 window 크기를 바꿔 보았을 때 깨달을 수 있다^^

 

glutReshapeFunc(reshape)

필자도 헷갈려서 위 코드의 주석으로 설명해 놓았듯이 ㅎㅎ

glViewport는 window 크기를 바꾸었을 때도 우리가 그린 그림이 찌그러지지 않고 나오도록 해준다.

 

그 원리는 아직 이해가 안돼서.. 다음에 추가해보겠다!

 

cf) 정규화된 디바이스 좌표계(NDC, Normalized Device Coordinate) 란
모든 좌표를 -1 ~ 1 사이의 값으로 보정하여 상대적으로 표시한 좌표계이다.

cf) 아핀 변환(Affine Transformation) 이란 평행성을 보존하는 기하 변환이다.
선형대수학에서 배우는 선형 변환.. 이 아닌 비선형 변환이다!
아핀 변환을 해도 평행한 선들은 평행한 상태로 유지되는 신기한 변환이다.