깊이 버퍼 업데이트는 GPU에서 어떻게 작동합니까?


10

지금은 소프트웨어에서 일종의 깊이 버퍼를 구현하려고하는데 그것에 쓸 때 큰 문제가 있습니다. 하나의 뮤텍스를 갖는 것은 절대적으로 과잉입니다. 그래서 스레드 수와 동일한 수의 뮤텍스를 만들었습니다. 현재 픽셀 (pixel_index % mutexes_number)을 기반으로 뮤텍스를 잠그고 있으며 더 잘 작동하지만 여전히 매우 느립니다. 실제 GPU에서 어떻게 수행되는지 궁금합니다. 영리한 알고리즘이나 하드웨어가 처리합니까?

답변:


9

고도로 전문화 된 하드웨어가이를 처리합니다. 일반적인 전략은 GPU가 래스터 화를 타일링하고 깊이 정보를 압축 형식으로 저장하는 것입니다 (예 : 다각형이 타일을 완전히 덮을 때 z- 식). 이를 통해 전체 타일에서 한 번에 테스트 할 수 있습니다. 다른 멋진 HW 트릭에는 픽셀 쉐이더가 실행되기 전에 깊이 테스트가 포함됩니다 (조건이 허용된다고 가정하면 쉐이더가 깊이 값을 쓸 수 없음). 각 스레드가 타일의 서브 세트를 "소유"하고 각 프리미티브를 독립적으로 걸거나 대체 프레임 또는 대체 래스터 라인과 같은 멀티 GPU 전략을 모방하는 것과 같은 소프트웨어와 유사한 것을 고려할 수 있습니다.


11

실제 GPU에서는 여러 코어가 동일한 깊이 버퍼의 동일한 영역을 읽거나 쓰려고 시도하고 이들 사이에서 동기화를 시도하는 대신 깊이 버퍼는 타일 (예 : 16x16 또는 32x32)로 분할되며 각각 타일은 단일 코어에 할당됩니다. 그러면 해당 코어는 해당 타일의 모든 래스터 화를 담당합니다. 해당 타일에 닿는 삼각형은 소유하는 코어에 의해 (타일 내에서) 래스터 화됩니다. 그런 다음 코어간에 간섭이 없으며 프레임 버퍼의 일부에 액세스 할 때 코어를 동기화 할 필요가 없습니다.

이것은 여러 타일에 닿는 삼각형이 여러 코어로 래스터 화되어야 함을 의미합니다. 따라서 지오메트리 처리 (정점과 삼각형에 대한 작업)와 픽셀 처리간에 작업 재배포 단계가 있습니다.

지오메트리 단계에서 각 코어는 여러 입력 프리미티브를 처리 할 수 ​​있습니다. 그런 다음 각 프리미티브에 대해 프리미티브 터치가 어느 타일 ( "거친 래스터 화"라고 함)을 신속하게 결정하고 영향을받는 타일 중 하나를 소유 한 각 코어의 대기열에 프리미티브를 추가 할 수 있습니다.

그런 다음 픽셀 단계에서 각 코어는 대기열에서 프리미티브 목록을 읽고 코어가 소유 한 타일의 픽셀 적용 범위를 계산하고 추가 조정없이 깊이 테스트, 픽셀 음영 처리 및 프레임 버퍼 업데이트를 진행할 수 있습니다. 다른 코어와 함께.

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