1. 스텐실(Stencil)
1.1 스텐실 버퍼란?
스텐실 버퍼는 컬러 및 깊이(depth) 버퍼 외에 특정 픽셀에만 그리기를 제한할 수 있는 8비트 정수형 버퍼이다. 이를 통해 렌더링할 영역을 선택적으로 제어할 수 있다.
1.2 스텐실 테스트
스텐실 테스트는 깊이 테스트 이전에 수행되며, 스텐실 버퍼에 저장된 값과 설정된 조건에 따라 해당 픽셀을 그릴지 여부를 결정한다. 다양한 연산을 지원하며, 아래와 같은 함수로 설정할 수 있다.
- 활성화/비활성화:
glEnable(GL_STENCIL_TEST);
/glDisable(GL_STENCIL_TEST);
- 스텐실 테스트 함수 설정:
glStencilFunc(GL_EQUAL, 1, 0xFF);
(비교 연산을 설정) - 스텐실 버퍼 업데이트 설정:
glStencilOp(GL_KEEP, GL_REPLACE, GL_INCR);
1.3 스텐실 활용 - 물체 외곽선 그리기
스텐실 버퍼를 사용하여 물체의 외곽선을 그리는 과정은 다음과 같은 단계로 이루어진다. 이 방법은 물체를 두 번 그리는 방식으로, 물체의 실제 크기와 약간 더 큰 크기의 두 가지 버전을 사용하여 외곽선 효과를 만들어낸다.
- 스텐실 버퍼 초기화 및 설정
스텐실 버퍼를 0으로 초기화한 후, 스텐실 테스트를GL_ALWAYS
로 설정하고 물체를 렌더링한다. 이때 스텐실 값을 1로 설정하여 그려진 영역을 표시한다. 이 과정은 스텐실 버퍼에 렌더링된 물체의 위치 정보를 저장하는 단계이다. - 외곽선 그리기 준비
이후 깊이 테스트를 비활성화하고, 스텐실 버퍼 업데이트를 막는다. 그런 다음, 동일한 물체를 약간 확대하여 그릴 준비를 한다. 물체를 확대하는 이유는 기존의 물체를 둘러싸는 외곽선을 생성하기 위함이다. 확대된 물체는 기존의 물체 바깥쪽을 덮는 형태가 되므로 외곽선처럼 보이게 된다. - 확대된 물체 렌더링
확대된 물체를 외곽선 전용 셰이더로 렌더링하되, 스텐실 값이 1이 아닌 부분에만 그리도록 설정한다. 이 설정을 통해 원래 물체가 있던 위치는 그대로 유지되고, 확대된 물체의 외곽 부분만 렌더링되어 외곽선 효과를 낼 수 있다. - 설정 복원
마지막으로 스텐실 테스트와 깊이 테스트 설정을 원래대로 복원하여 다음 렌더링 작업에 영향을 미치지 않도록 한다.
이 과정에서 스텐실 버퍼는 외곽선이 그려질 영역을 결정하는 데 사용되며, 확대된 물체를 그릴 때 원래의 물체 영역을 제외하여 외곽선만 보이게 하는 역할을 한다. 이러한 기법을 통해 단순한 색상 변화나 텍스처 없이도 선명한 외곽선을 구현할 수 있다.
2. 블렌딩(Blending)
2.1 블렌딩이란?
블렌딩은 현재 그리려는 픽셀과 프레임버퍼에 저장된 픽셀 간의 연산을 통해 색상을 혼합하는 과정이다. 주로 반투명한 오브젝트를 렌더링할 때 사용된다.
2.2 블렌딩 활성화 및 설정
- 활성화:
glEnable(GL_BLEND);
- 블렌딩 함수:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
(알파값에 따라 색상 혼합)
블렌딩 연산은 다음과 같은 방식으로 설정할 수 있다.
glBlendFunc
함수로 소스와 대상의 연산 방식을 설정.glBlendEquation
함수로 연산자를 설정 (GL_FUNC_ADD
,GL_FUNC_SUBTRACT
등).
2.3 블렌딩 문제점
블렌딩 시 문제가 발생하는 경우는 주로 그리기 순서 때문이다. 반투명한 물체를 앞에서부터 그리면, 먼저 그린 오브젝트가 깊이 버퍼 값을 갱신하여 뒤에 있는 물체가 제대로 렌더링되지 않을 수 있다.
- 문제 원인: 깊이 테스트는 이미 그려진 픽셀과의 깊이 비교를 통해 다음 픽셀의 그리기 여부를 결정하는데, 반투명한 오브젝트는 겹치는 영역의 처리가 복잡해진다.
2.4 블렌딩 문제 해결 방안
- 쉬운 방법: 오브젝트를 그리기 전에 카메라 방향을 기준으로 정렬하여 그리기. 즉, 반투명한 물체를 원거리에서 근거리 순으로 그린다.
- 복잡한 방법: Order-Independent Transparency(OIT)를 사용하여 더 정교하게 반투명 오브젝트를 처리할 수 있다. OIT에 대한 자세한 내용은 LearnOpenGL의 OIT 소개를 참고한다.
3. 페이스 컬링(Face Culling)
3.1 페이스 컬링이란?
페이스 컬링은 삼각형의 앞면과 뒷면을 구분하여 보이지 않는 면을 그리지 않는 최적화 기법이다. 보통 반시계 방향(CCW)으로 정의된 삼각형을 앞면으로 취급한다.
3.2 페이스 컬링 설정
- 컬링 활성화/비활성화:
glEnable(GL_CULL_FACE);
/glDisable(GL_CULL_FACE);
- 앞면/뒷면 설정:
glFrontFace(GL_CCW);
(CCW 방향을 앞면으로 설정) - 컬링 대상 설정:
glCullFace(GL_BACK);
(뒷면을 컬링)
3.3 페이스 컬링의 활용
페이스 컬링은 불필요한 면을 그리지 않음으로써 렌더링 성능을 최적화할 수 있다. 특히, 닫힌 오브젝트 내부에서 바라보는 경우 뒷면을 그리지 않도록 설정하면 효과적이다.
'Computer Graphics > OpenGL' 카테고리의 다른 글
OpenGL 정리 - 21. 큐브 맵 (Cubemap) (0) | 2024.10.28 |
---|---|
OpenGL 정리 - 20. 프레임 버퍼 (Frame Buffer) (0) | 2024.10.25 |
OpenGL 정리 - 18. Depth Buffer, 깊이값 왜곡, Z-fighting (0) | 2024.10.23 |
OpenGL 정리 - 17. 오브젝트 로더 구현 (Assimp) (1) | 2024.09.24 |
OpenGL 정리 - 16. Light Casters (0) | 2024.09.23 |