깊이 및 스텐실 버퍼
깊이 버퍼와 스텐실 버퍼는 2D 및 3D 게임에서 그림자 맵핑, 지연 렌더링, 볼륨 렌더링, 앰비언트 오클루전 등과 같은 고급 그래픽 효과를 위해 사용되는 두 가지 데이터 버퍼입니다. 이들은 각각 모든 픽셀에 대해 24비트 깊이 값과 8비트 스텐실 값을 저장합니다. 깊이 버퍼가 활성화되면 모든 표면에 대해 생성됩니다. 기본적으로 표면은 깊이 버퍼(및 스텐실 버퍼)와 함께 생성되며, z-쓰기(z-writing)는 활성화되고 z-테스트(z-testing)와 스텐실 테스트는 비활성화됩니다. 깊이 버퍼와 스텐실 버퍼는 항상 함께 존재합니다. 즉, 표면에 깊이 버퍼가 있으면 스텐실 버퍼도 있으며, 깊이 버퍼가 없으면 스텐실 버퍼도 없습니다. 깊이 및 스텐실 버퍼는 해당 표면이 속한 비디오 메모리(VRAM)에 저장됩니다. 자동 깊이 버퍼 및 스텐실 버퍼 생성을 비활성화하려면 surface_depth_disable
을 사용할 수 있습니다.
깊이 버퍼
깊이 버퍼는 z-버퍼라고도 하며, 생성된 표면과 동일한 크기로 만들어진 그래픽 버퍼입니다. 표면의 모든 픽셀에 대해 24비트 깊이 값을 저장하며, 이는 표면에서의 거리 정보를 담고 있습니다. 깊이 버퍼는 그레이스케일 이미지로 표시될 수 있으며, 흰색(값 1)은 픽셀이 가장 멀리 있는 것을 나타내고, 검은색(값 0)은 가장 가까운 픽셀을 나타냅니다.
기본적으로 GameMaker에서는 깊이 버퍼가 활성화되어 있어 모든 표면이 깊이 버퍼와 함께 생성됩니다. 이는 기본적으로 그려지는 application_surface
에도 적용됩니다.
깊이와 깊이 버퍼의 차이
GameMaker에서 "깊이"라는 용어는 두 가지 다른 의미로 사용됩니다:
- 그려지는 객체의 깊이 값: GameMaker에 의해 자동으로 또는 코드로 수동으로 설정됩니다.
- 방 편집기에서의 레이어 깊이
- 객체 인스턴스의
depth
변수로 설정된 깊이 - GML 코드에서
gpu_set_depth
를 사용하여 수동으로 설정한 깊이 값 - 깊이 버퍼: 표면의 모든 픽셀에 대한 깊이 값을 저장합니다. 이 깊이 값은 가까운 평면과 먼 평면 사이의 거리 비율입니다. 값 0은
znear
에 해당하고, 값 1은zfar
에 해당합니다. 이 값은 현재 사용 중인 카메라와 그 투영 유형(원근 또는 직교)에 따라 달라집니다.
깊이 버퍼는 모든 변환이 적용된 후의 값을 저장합니다. draw_clear_depth
를 사용하여 깊이 버퍼의 모든 값을 0(근거리)과 1(원거리) 사이의 값으로 재설정할 수 있습니다.
깊이 테스트
깊이 테스트는 그려지는 픽셀에 대해 수행되는 테스트로, 기본적으로 비활성화되어 있으며 gpu_set_ztestenable
로 활성화할 수 있습니다. 활성화되면 GPU는 현재 그리기 명령에 영향을 받는 모든 픽셀에 대해 테스트를 수행합니다. 기본적으로 이 테스트는 cmpfunc_lessequal
로 설정되어 있으며, gpu_set_zfunc
를 사용하여 다른 비교로 변경할 수 있습니다.
테스트는 다음과 같이 작동합니다:
depth_of_pixel_being_written cmp_func value_at_pixel_in_depth_buffer
픽셀이 깊이 테스트를 통과하면 스텐실 테스트로 넘어갑니다(활성화된 경우). 모든 테스트가 통과하면 픽셀이 최종적으로 그려집니다. 깊이 테스트가 통과하면 깊이 값을 덮어쓰려면 z-쓰기가 활성화되어 있어야 하며, 이는 기본적으로 활성화되어 있습니다.
깊이 테스트 예제
// 1
gpu_set_ztestenable(true);
draw_clear_alpha(#282828, 1);
draw_clear_depth(1);
// 2
var _c = #BB6666;
gpu_set_depth(1000);
draw_rectangle_color(25, 25, 125, 125, _c, _c, _c, _c, false);
// 3
_c = #449999;
gpu_set_depth(2000);
draw_circle_color(125, 125, 50, _c, _c, false);
이 예제에서는 배경을 회색으로 지우고 깊이 버퍼를 1로 지웁니다. 두 번째 단계에서 깊이를 1000으로 설정하고 사각형을 그립니다. 세 번째 단계에서는 깊이를 2000으로 설정하고 원을 그립니다. 깊이 테스트를 사용하면 무작위 순서로 그리면서도 객체가 시점에서의 거리 순서에 따라 올바르게 정렬되도록 할 수 있습니다.
깊이 버퍼 사용 방법
다음은 깊이 버퍼와 깊이 테스트를 사용하는 일반적인 개요입니다:
gpu_set_ztestenable
로 깊이 테스트를 활성화합니다.- 깊이 버퍼를 1로 지웁니다.
gml draw_clear_depth(1);
- 스프라이트, 텍스트, 입자, 3D 모델 등을 그립니다.
- 필요에 따라 깊이 버퍼를 후속 그리기 패스에서 사용합니다.
- 깊이 버퍼의 내용을 일반 버퍼로 복사하거나 업데이트합니다.
스텐실 버퍼
스텐실 버퍼는 깊이 버퍼와 마찬가지로 비디오 메모리에 저장되는 그래픽 버퍼로, 생성된 표면과 동일한 크기로 만들어집니다. 각 픽셀에 대해 8비트 정수 스텐실 값을 저장하며, 0에서 255까지의 256개 가능한 값을 허용합니다.
스텐실 테스트
스텐실 테스트는 깊이 테스트와 유사하게 표면에 그려지는 모든 픽셀에 대해 수행됩니다. 기본적으로 비활성화되어 있으며 gpu_set_stencil_enable
로 활성화할 수 있습니다. 비교는 스텐실 참조 값과 스텐실 버퍼의 현재 값을 비교합니다.
스텐실 테스트는 깊이 테스트보다 더 유연하며, 테스트가 통과할 때와 실패할 때 수행할 작업을 설정할 수 있습니다.
스텐실 버퍼 사용 방법
스텐실 버퍼를 사용하는 방법은 다음과 같습니다:
gpu_set_stencil_enable
로 스텐실 테스트를 활성화합니다.- 스텐실 비교 함수를 설정합니다.
- 스텐실 버퍼를 특정 값으로 지웁니다.
- 스텐실 참조 값을 변경한 후 표면에 그립니다.
함수 목록
다음 함수들은 깊이 및 스텐실 버퍼를 지우는 데 사용됩니다:
draw_clear_depth
draw_clear_stencil
draw_clear_ext
기타 깊이/스텐실 버퍼와 관련된 값을 설정하거나 가져오는 함수는 GPU 제어에 나열되어 있습니다.