스텐실 버퍼 란?


26

Wikipedia에 따르면 스텐실 버퍼는 셰이더가 사용할 수있는 임의의 버퍼입니다.

그러나 깊이와 픽셀 버퍼를 클리핑하거나 "단단하게 바인딩"하는 데 사용되며 약간 상반되는 내용을 암시합니다.

스텐실 버퍼는 실제로 무엇을 하며 현대 응용 분야에서 실제로 어떻게 사용됩니까?

답변:


31

Wikipedia의 스텐실 버퍼 정의는 실제로 크지 않으며 현대 구현 (OpenGL)의 세부 사항에 너무 집중합니다. 명확한 버전 을 이해하기가 더 쉽다는 것을 알았습니다 .

스텐실은 사용될 때마다 동일한 문자, 기호, 모양 또는 패턴을 그리거나 그리는 데 사용되는 템플릿입니다. 이러한 템플릿으로 제작 된 디자인을 스텐실이라고도합니다.

이것이 바로 스텐실이 컴퓨터 그래픽 이전의 의미였습니다. Google 이미지에 스텐실 을 입력 하면 첫 번째 결과 중 하나입니다.

스텐실 마스크

보다시피, 그것은 패턴의 네거티브를 무언가에 "페인트"하는데 사용될 수있는 마스크 나 패턴입니다.

버퍼 스텐실 동일한 방식으로 작동합니다. 스텐실 렌더 패스를 수행하여 스텐실 버퍼를 선택한 패턴으로 채운 다음 후속 도면에서 패턴을 해석하는 방법을 정의하는 적절한 스텐실 기능을 설정 한 다음 최종 장면을 렌더링 할 수 있습니다. 비교 기능에 따라 스텐실 마스크의 거부 된 영역으로 떨어지는 픽셀은 그려지지 않습니다.


스텐실 버퍼를 구현할 때 때로는 깊이 버퍼와 결합되기도합니다. 대부분의 그래픽 하드웨어는 1 바이트 (8 비트) 스텐실 버퍼를 사용하므로 대부분의 응용 프로그램에 충분합니다. 심도 버퍼는 일반적으로 3 바이트 (24 비트)를 사용하여 구현되며, 이는 대부분의 종류의 3D 렌더링에 충분합니다. 따라서 스텐실 버퍼의 8 비트를 다른 깊이 버퍼의 24 개와 함께 묶는 것이 논리적이므로 각 심도 + 스텐실 픽셀을 32 비트 정수로 저장할 수 있습니다. Wikipedia가 의미하는 바는 다음과 같습니다.

깊이 버퍼와 스텐실 버퍼는 종종 그래픽 하드웨어의 RAM에서 동일한 영역을 공유합니다.


스텐실 버퍼가 왕이었던 응용 프로그램 중 하나는 섀도우 렌더링 ( shadow shadow ) 또는 때로는 적절하게 스텐실 쉐도우 ( stencil shadows) 라고 하는 기술에서 섀도 렌더링에 사용되었습니다 . 이것은 버퍼를 매우 영리하게 사용했지만 오늘날 렌더링 필드의 대부분은 깊이 기반 그림자 맵으로 이동 한 것으로 보입니다.


하나의 문자이지만 cleaver-> clever입니다. 나는 그것을 편집 할 수 없다. D : 그건 그렇고, 그것은 지금까지 가장 의미가있다.
Qix

3
픽셀 당 값 비싼 셰이더가있는 경우 스텐실 버퍼를 사용하여 유사한 스레드를 일괄 처리 하여이 OIT 용지 ( 2.2 초 (면책 조항 : 저자 임)) 와 같이 확산을 줄이고 점유율을 높일 수 있습니다.
jozxyqk

@ jozxyqk, 그것은 바로 상자 밖에서 생각하는 것입니다! 아주 좋아요
glampert

13

스텐실 버퍼는 현재 8 비트의 부호없는 정수 버퍼로, 스텐실 테스트 후 다양한 작업 ( : OpenGL Ops here)을 사용하여 원하는 픽셀 당 정보를 채울 수 있습니다 .

스텐실 테스트는 단순히 현재 픽셀 스텐실 값이 스텐실 버퍼의 내용에 대해 테스트되는 픽셀 별 작업입니다. 스텐실 테스트가 통과되는 조건을 설정합니다 (예 : 항상, LESS 등).

테스트 결과에 따라 스텐실 값에 어떤 일이 발생하는지 결정할 수 있습니다 (위의 링크 작업을 사용하여 OpenGL에서).

스텐실 버퍼는 몇 가지 용도로 사용되며 첫 번째 용도는 다음과 같습니다.

  • 프레임 버퍼의 특정 부분을 선택적으로 렌더링하고 나머지는 버리는 마스크로 사용할 수 있습니다. 예를 들어, 이것은 반사에 유용하지만 훨씬 더 유용합니다. 다중 해상도 렌더링을 처리 할 때는 고해상도로 렌더링해야하는 가장자리를 마크 업하는 데 사용할 수 있습니다. 실제로 마스킹 사용법이 많이 있습니다.
  • 예를 들어 매우 간단한 오버 드로우 필터입니다. 스텐실 테스트를 항상 통과하고 항상 값을 증가 시키도록 설정할 수 있습니다. 스텐실 버퍼에서 끝나는 값은 오버 드로우를 나타냅니다. [*]

과거에는 Shadow volume과 같은 그림자 기법에도 사용되었습니다.

빈약 한 스텐실 버퍼는 종종 과소 평가되지만 그래픽 프로그래머의 무기고에서 좋은 무기가 될 수 있습니다.

[*] 올바른 SRV를 사용하여 사후 프로세스에서 다시 읽을 수있는 값!

편집 : 또한 Shader Model 5.1 (D3D11.3 및 D3D12)에서 스텐실 참조 값에 액세스 할 수 있음을 언급 할 가치가 있습니다. SV_StencilRef


6

스텐실 버퍼는 픽셀 당 정수 데이터를 포함하는데, 이는 렌더링되는 픽셀에 대한 제어를 강화하는 데 사용됩니다.

스텐실 버퍼는 깊이 버퍼와 유사하게 작동합니다. 마찬가지로 스텐실 데이터는 깊이 버퍼에 저장됩니다. 깊이 데이터는 어떤 픽셀이 카메라에 가장 가까운지를 결정하지만, 스텐실 데이터는 픽셀을 저장 또는 폐기하기 위해보다 일반적인 목적의 픽셀 당 마스크로 사용될 수 있습니다. 마스크를 만들려면 스텐실 함수를 사용하여 픽셀이 렌더링 될 때마다 참조 스텐실 값 (전역 값)을 스텐실 버퍼의 값과 비교하십시오.

출처 : 스텐실 버퍼 란? | Microsoft 개발자 네트워크

일반적인 아이디어는 각 픽셀의 값을 설정 한 다음 동작 (설정 할 수 있다는 것입니다 GREATER, SMALLER, EQUALtrue로 평가됩니다은 픽셀 음영 처리 및 표시 될 때, 등).

반사 텍스처를 렌더링 할 때 스텐실 버퍼는 반사가 적용되는 마스크를 만드는 데 사용되는 실시간 반사입니다. 예를 들어 반사는 유리 재질 음영 삼각형에만 적용됩니다. 또한 전체 프레임 버퍼에 대해 임의의 2 차원 마스크를 만드는 데 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.