OpenGL

[OpenGL] Viewport와 Scissor Box

usingsystem 2024. 5. 10. 15:47
728x90
  • WC는 다양한 디바이스의 디스플레이 해상도와 무관하게 그림을 표현할 수 있습니다.
  • NDC는 해상도에 맞춰서 일일이 그림을 만드는 작업을 하는 것보다는 디바이스 해상도를 무시해 버리고 일단 마이너스 1에서 플러스 1까지 가는 어떤 그림을 만드는 것이다.

OpenGL의 뷰포트(Viewport)는 OpenGL의 출력 영역을 나타낸다. 보통은 window전체를 사용하지만 window 내의 직사각형 영역을 미니맵처럼 따로 설정 가능 합니다. 즉 렌더링 된 이미지가 표시될 프레임버퍼의 영역을 정의합니다.

뷰포트는 윈도 내에서 직사각형 영역이 되어야 되기 때문에 정수좌표계를 가져야 합니다. 그래서 정수 좌표계를 갖는 wc좌표계를 갖게 됩니다. 

즉 프레임버퍼의 영역은 WC(Window Coordinate)를 사용하며 어떠한 DEVICE가 와도 대응이 가능하게 하며 NDC 전체 영역이 mapping 되는 직사각형 영역을 설정합니다.(NDC입장에서 그림을 그린다.)

 

뷰포트는 glViewport() 함수를 사용하여 설정되며 미니맵을 만드는데 용의 합니다.

const unsigned int WIN_W = 320; // window size in pixels, (Width, Height)
const unsigned int WIN_H = 240;
GLint map_x = (GLint)(WIN_W * 0.70F);
GLint map_y = (GLint)(WIN_H * 0.05F);
GLsizei map_w = (GLsizei)(WIN_W * 0.25F);
GLsizei map_h = (GLsizei)(WIN_H * 0.25F);
glViewport(map_x, map_y, map_w, map_h);

위의 소스코드를 실행하면 미니맵이 업데이트 되지 않는 문제점이 발생한다 때문에 Scissorbox개념이 존재한다.

 

Scissor Box - 뷰포트와 NDC와 관계없이 window 내에서 출력이 허용되는 직사각형 영역을 설정하며 update되는 개념 (WC입장에서 그림을 그린다.)

	// mini-map, cube only
	GLint map_x = (GLint)(win_w * 0.70F);
	GLint map_y = (GLint)(win_h * 0.05F);
	GLsizei map_w = (GLsizei)(win_w * 0.25F);
	GLsizei map_h = (GLsizei)(win_h * 0.25F);
	glViewport(map_x, map_y, map_w, map_h);
	glEnable(GL_SCISSOR_TEST);
	glScissor(map_x, map_y, map_w, map_h);
	glClearColor(0.5F, 0.5F, 1.0F, 1.0F);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glScissor(0, 0, win_w, win_h);
	glDisable(GL_SCISSOR_TEST);
	glDrawArrays(GL_TRIANGLES, 0, 36); // 36 vertices
728x90