포스트

[ Reference ] Stencil Routed A Buffer

개요


1. 개요

멀티샘플 텍스처를 사용하여 픽셀당 조각 벡터를 저장함으로써 GPU 가속 A-버퍼를 구현하기 위한 스텐실 라우팅 알고리즘

  1. 모든 조각들은 래스터화 순서에 따라 픽셀별로 캡처
  2. 전체 화면 셰이더 패스는 bitonic sort을 사용하여 조각을 정렬(이때 정렬된 프래그먼트를 임의로 블렌딩하여 차수 독립 투명도 또는 계층화된 깊이 이미지 생성과 같은 다양한 유형의 알고리즘을 구현 가능)

※ 패스당 8개의 프래그먼트만 처리


Depth peeling(Everitt 2001)보다 8배 더 빠르게 조각을 캡처, Depth peeling과 달리 조각이 깊이 별로 정렬되지 않으므로 나중에 정렬

멀티샘플텍스처를 사용하여 픽셀 당 요소 벡터를 저장.기존 MSAA(다중 샘플 앤티앨리어싱)에 이 버퍼를 사용하는 대신 Z 방향으로 조각 정보를 저장하도록 샘플을 다시 정렬, 앨리어싱된 래스터화(D3D10 MultisampleEnable에서 FALSE로 설정)를 사용하여 MSAA 버퍼에 렌더링하여 수행한다.

일반적으로 앨리어스 모드에서 MSAA 버퍼로 렌더링하면 모든 하위 픽셀 조각이 픽셀당 계산된 동일한 값을 수신하게 됩니다. 한 번에 하나의 샘플만 업데이트하기 위해 서브픽셀 스텐실 라우팅을 사용한다.

2. Subpixel Stencil Routing

다중 샘플링이 비활성화된 D3D10 환경에서 다중 샘플 텍스처로 삼각형을 래스터화하면 조각이 픽셀 수준에서 음영 처리됩니다. 그러나 스텐실은 pixel level에서 테스트

  • fullscreen quads와 스텐실 마스크를 사용, 4개의 서브 샘플(4xMSAA)이 있는 단일 픽셀에 대해 스텐실 버퍼를 다음과 같이 초기화한다고 가정

1 2
3 4

  • 조각이 이 픽셀에 도달할 때 스텐실 작업을 D3D10 STENCIL OP DECR SAT로 설정하면 스텐실이 다음과 같이 변경

0 1
2 3

  • 스텐실 테스트를 참조 값이 1인 D3D10 COMPARISON EQUAL로 설정하면 1인 서브 샘플만 사용, 이를 통해 다중 샘플 색상 텍스처의 하위 샘플로 조각을 라우팅(4xMSAA에서 픽셀당 4개의 조각).


※ 문제는 4회 통과 후에도 스텐실 값이 여전히 모두 0으로 포화. 오버플로를 방지하기 위해 스텐실 초기화를 1 대신 2에서 시작하도록 변경, 스텐실 참조 값을 2로 변경. 4개의 조각이 이 픽셀에 도달한 후 하위 샘플 스텐실 값은 다음과 같다.

0 0
0 1

오버플로를 확인하려면 전체 화면 쿼드를 렌더링하고 마지막으로 업데이트 된 샘플(그림의 오른쪽 아래)을 제외한 모든 샘플을 마스킹


  • 모든 프리미티브를 A-Buffer에 래스터화하여 일반적으로 일부 색상 값과 일부 깊이 값을 작성

  • 셰이더4의 load를 사용, 각 A 버퍼에서 개별 샘플을 읽는다.

  • 최종 텍스처에 혼합하기 전, 셰이더에서 bitonic 정렬 사용

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.