Appearance
3D 그래픽 개념 및 렌더링 파이프라인(5)
[칼럼 핵심 요약]
픽셀 쉐이더의 출력은, 굉장히 말하면 「폴리곤을 구성하는 그 픽셀가, 그 씬에서는 그 색으로 결정되었습니다」라고 하는 것이며, 그대로 비디오 메모리에 기입해 「1픽셀의 묘화 처리 완료」라고 하고 싶은 곳이지만, 아직 하는 일이 있다. 그것이 렌더링 백엔드입니다.🌐 원문 링크: 3Dグラフィックスの概念とレンダリングパイプライン(5) (Mynavi News)
📅 원문 발행일: 2008-04-18 | ✍️ 저자: 西川善司 (니시카와 젠지 / Zenji Nishikawa)
NOTE
💡 현대 그래픽스 관점에서의 발전사 (Modern Retrospective)
- 전통적 파이프라인의 재편: 버텍스 셰이더 → 지오메트리 셰이더 → 래스터라이저로 이어지던 전통적 파이프라인은 DX12 Ultimate / Vulkan에서 태스크 셰이더(Amplification/Task Shader) → 메시 셰이더(Mesh Shader) 파이프라인으로 대체되어, 지오메트리 컬링과 LOD 처리를 GPU 코어에서 고도로 병렬화하고 있습니다.
- Draw Call 오버헤드 해소: 과거 CPU 병목의 주원인이었던 드로우 콜(Draw Call)은 모던 저수준 API(Vulkan, DirectX 12, Metal)의 바인드리스(Bindless) 렌더링과 GPU 구동 파이프라인(ExecuteIndirect / GPU-Driven Rendering)을 통해 수만 단위의 드로우를 단일 명령으로 처리합니다.
📖 본문 해설
[원문 리드문] > 픽셀 쉐이더의 출력은, 굉장히 말하면 「폴리곤을 구성하는 그 픽셀가, 그 씬에서는 그 색으로 결정되었습니다」라고 하는 것이며, 그대로 비디오 메모리에 기입해 「1픽셀의 묘화 처리 완료」라고 하고 싶은 곳이지만, 아직 하는 일이 있다. 그것이 렌더링 백엔드입니다.
그림 1: GPU 내부의 렌더링 흐름
렌더링 최종 공정~렌더 백엔드
픽셀 쉐이더의 출력은, 굉장히 말하면 「폴리곤을 구성하는 그 픽셀가, 그 씬에서는 그 색으로 결정되었습니다」라고 하는 것이며, 그대로 비디오 메모리에 기입해 「1픽셀의 묘화 처리 완료」라고 하고 싶은 곳이지만, 아직 하는 일이 있다.
그것이 [10]의 렌더 백엔드(Render Backend)다. 덧붙여서 NVIDIA의 경우는 이 부분을 ROP 유닛이라고 부르고 있다. ROP 유닛은 Rendering Output Pipeline, 혹은 Raster OPeration의 약어라는 제설이 있지만 확실하지 않다. 덧붙여 본 연재에서는 전자를 정답으로 해석해 둔다.
어쨌든, 여기서는 픽셀 쉐이더로부터의 출력을 "기입할 수 있는지의 검증", 기입시에는 "어떻게 기입할지의 결정"등의, 비디오 메모리에의 기입 제어 부분이 된다. 픽셀 셰이더 자체는 텍스처를 읽을 수 있지만 비디오 메모리에 쓸 수 없기 때문에이 프로세스는 매우 중요한 부분입니다.
그런데, DirectX 9/SM2.0세대 이전의 GPU에서는 픽셀 쉐이더의 개수와 ROP 유닛의 개수가 항상 일치하고 있었기 때문에, 픽셀 쉐이더와 ROP 유닛은 "쌍"과 같은 관계를 이미지 할 수 있었다. 그러나, DirectX 9/SM3.0세대 이후의 GPU에서는, 픽셀 쉐이더 프로그램의 고도화에 수반해, 픽셀 쉐이더의 개수의 증강이 중점적으로 행해져, 결과, ROP 유닛의 개수는 픽셀 쉐이더의 개수보다 적은 것이 일반적이 되고 있다.
최근의 GPU에서는 픽셀 쉐이더>ROP 유닛의 구성이 일반적이 되었다. 그림은 GeForce 7800 GTX의 블록다이어그램. 중단의 4×6=24기가 픽셀 쉐이더. 최하단의 16기가 ROP 유닛
「기입해도 좋은 것인가의 검증」으로서는 「알파 테스트」 「스텐실 테스트」 「심도 테스트」라고 하는 것이 있다.
알파 테스트는 출력하는 픽셀색이 완전히 투명한지의 테스트. α 요소가 0이고 투명하면 그릴 필요가 없으므로 픽셀 드로잉은 삭제됩니다.
그림 7: 알파 테스트 - 불투명 부분의 픽셀만 그려짐
스텐실 테스트는 다목적 연산 프레임 버퍼로 사용되는 스텐실 버퍼의 내용에 따라 응용 프로그램이 설정 한 조건을 통과 할 수 없으면 픽셀 드로잉을 버립니다. 화면의 일부를 바르거나 스텐실 섀도우 볼륨 기법에 의한 그림자 생성의 그림자 빼기 처리 등의 경우에 응용된다.
그림 8: 스텐실 테스트 - 스텐실 버퍼의 내용을 참조하여 미리 설정한 테스트 조건을 만족하면 드로잉. 이 그림은 "스텐실 버퍼의 내용이 A 부분에만 장면을 그린다"는 예
심도 테스트는 앞으로 그리는 픽셀이, 시점에서 보고 제일 앞이 되어 제대로 보이는 픽셀이 될지 어떨지를 검사하는 것. 묘화 하는 픽셀과 1대 1에 대응하는 Z 버퍼라고 불리는 깊이값(Z값, 심도값)을 격납한 버퍼를 미리 준비해 두어, 여기로부터 읽어낸 깊이값과, 지금부터 묘화하려고 하고 있는 픽셀의 깊이값을 비교하는 것이 「심도 테스트의 실태」이다. 깊이 값은 픽셀 셰이더에 의해 계산됩니다.
또한, 반투명의 3D 오브젝트를 구성하는 반투명 픽셀의 묘화 등의 경우 등은 이 깊이 테스트 자체를 행하지 않는 경우도 있다.
그림 9a : 심도 테스트 - 순차적 인 무작위로 그릴 때 심도 테스트가 중요합니다.
그림 9b : Z 버퍼에 깊이 값의 쓰기 흔적이없는 곳은 무조건 쓰기. 기입 흔적이 있는 곳에서는 심도 테스트를 실시해 앞으로 그려내려고 하고 있는 픽셀이 앞이라고 판단할 수 있는 경우만 그려낸다
「어떻게 기입하는지의 결정」의 바리에이션으로서는 「α합성(α블렌딩)」, 「포그(안개)」등이 있다.
α합성은, 단지 픽셀을 덮어쓰기로 그리는 것이 아니라, 이미 기입해지고 있는 픽셀색과 반투명 합성의 계산을 해 써 되돌린다, 라고 하는 처리를 행하는 것. 렌더링 대상의 프레임 버퍼로부터 픽셀 색을 읽는다. 여담이지만, 3D 벤치마크 소프트 등에서 반투명 폴리곤의 겹쳐 그리기를 연속적으로 하거나 하는 것은 이 성능을 평가할 목적이 있기 때문이다.
그림 11: α합성 - α합성에서는 이미 렌더링되어 있는 결과를 읽고, 한층 더 합성 계산을 실시해 그려내게 되므로 부하가 높다
안개는 앞으로 그리는 픽셀의 깊이 값에 따라 미리 설정된 안개 색상의 혼합 상태를 조정하는 과정을 수행합니다. 안쪽에 가면 갈수록 그 픽셀색을 흰색에 가깝게 하는 설정으로 하면 안쪽이 희미해 보이는 공기 원근의 표현을 할 수 있다.
그림 12: 안개 - 안쪽으로 가면 안쪽으로 갈수록 흐릿한 픽셀 값으로 하는 것으로 공기 원근의 표현을 할 수 있다
물론, α 합성이나 안개 처리를 행하지 않는 경우, 그 픽셀 색을 그대로 비디오 메모리에 기입하는 처리를 행한다. 그리고 내보낼 때는 다음 번 이후의 다른 픽셀의 깊이 테스트에 대비하여 깊이 값도 업데이트합니다.
또한, 격자형 픽셀 배열의 화면 묘화에 있어서의 픽셀의 각진 느낌(자기)을 저감시키는, 앤티앨리어싱 처리도, 이 렌더 백엔드의 부분에서 행해지고 있다.
(트라이Z 니시카와 젠지)