Quick Flow
새 framebuffer 픽셀 크기 확인
→ 0 크기면 그리기 보류, 이벤트는 계속 처리
→ 크기가 바뀐 출력 이미지 재할당·FBO 확인
→ viewport·scissor 갱신 → projection 종횡비 갱신 → drawviewport는 좌표를 출력 영역으로 옮기고, scissor는 기록 가능한 영역을 제한합니다. 창 크기 변경만으로 사용자 FBO나 투영 행렬이 자동 갱신되지는 않습니다.
상태와 단위
| 상태 | 기본 조건 | 설정과 영향 |
|---|---|---|
| viewport x/y | 초기 0 | 창 좌표 기준 시작점 |
| viewport width/height | 초기 연결 창 크기, 구현 제한 적용 | 음수 불가, 픽셀 크기 사용 |
| scissor test | 초기 비활성 | 켜면 사각형 밖 기록 제한 |
| scissor box | 초기 창 영역 | 음수 폭·높이 불가, clear에도 영향 |
| projection aspect | 애플리케이션 계산 값 | 새 width/height 비율로 재계산 |
GLFW의 창 크기와 framebuffer 크기는 고해상도 화면에서 다를 수 있습니다. renderbuffer·texture의 픽셀 크기, viewport, 화면 공간 계산에 필요한 값은 framebuffer 크기를 기준으로 정합니다. 창 좌표로 들어오는 마우스 입력은 필요한 경우 비율 변환합니다.
최소 갱신 예제
// GLFW 3.4, GL 3.3 Core 루프의 일부입니다.
int width = 0, height = 0;
glfwGetFramebufferSize(window, &width, &height);
if (width > 0 && height > 0) {
glViewport(0, 0, width, height);
glDisable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT);
// 여기서 해당 종횡비의 projection을 올리고 그립니다.
}이 발췌는 기본 프레임버퍼가 선택되어 있다는 전제입니다. 사용자 FBO 패스에서는 그 첨부 이미지의 크기를 사용합니다. 매 프레임 무조건 이미지를 재할당하지 않고 크기가 실제로 바뀔 때만 저장소를 갱신합니다.
부분 영역 UI나 타일 출력을 그릴 때는 scissor를 켜고 필요한 사각형을 지정합니다. 그 뒤 전체 화면 clear에서 scissor를 끄거나 전체 영역으로 갱신하지 않으면 이전 이미지의 일부가 남습니다. viewport가 clear 범위를 제한한다고 생각하면 이 문제를 놓칩니다.
부분 영역을 실제로 설정할 때는 framebuffer 픽셀 단위 사각형을 지정합니다. 다음은 왼쪽 아래 100×80 픽셀만 기록하도록 제한하는 구간이며, 대상이 그 크기 이상이라는 전제입니다.
glEnable(GL_SCISSOR_TEST);
glScissor(0, 0, 100, 80);
// 이 영역의 draw 또는 clear
glDisable(GL_SCISSOR_TEST);버전과 여러 출력 영역
단일 viewport·scissor는 1.0부터의 기능입니다. 4.1의 viewport array 경로는 여러 viewport·scissor·depth range를 다루지만 3.3 기본 루프에 같은 API를 넣을 수는 없습니다. clip origin을 바꾸는 상위 기능을 사용한다면 화면 좌표 규약도 함께 확인합니다.
최소화·화면 이동·고해상도 배율 변경을 단순한 창 resize 한 종류로만 보지 않습니다. 플랫폼 콜백으로 이벤트를 받더라도 렌더링 시점에 사용할 크기와 자원 수명이 맞아야 합니다. 깊이·MSAA 첨부도 색 출력과 함께 크기를 바꿉니다.
참고 링크
3 sources