Appearance
3D 그래픽 개념 및 렌더링 파이프라인(2)
[칼럼 핵심 요약]
DirectX 9/SM3.0세대 이전의, 지오메트리 셰이더가 없는 세대의 GPU에서는, 3D모델의 버텍스 정보라고 하는 것은 CPU측의 소프트웨어로 미리 준비해 두는 것이고, 일단 GPU에 입력하면, 이것을 GPU측에서 마음대로 증감할 수 없었다. 그때까지의 "대원칙의 틀"을 깨고 버텍스을 자유자재로 증감할 수 있는 기능을 가진 셰이더가 '지오메트리 셰이더'이다.🌐 원문 링크: 3Dグラフィックスの概念とレンダリングパイプライン(2) (Mynavi News)
📅 원문 발행일: 2008-03-28 | ✍️ 저자: 西川善司 (니시카와 젠지 / 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)을 통해 수만 단위의 드로우를 단일 명령으로 처리합니다.
📖 본문 해설
[원문 리드문] > DirectX 9/SM3.0세대 이전의, 지오메트리 셰이더가 없는 세대의 GPU에서는, 3D모델의 버텍스 정보라고 하는 것은 CPU측의 소프트웨어로 미리 준비해 두는 것이며, 일단 GPU에 입력하면, 이것을 GPU측에서 마음대로 증감할 수는 없다. 그때까지의 "대원칙의 틀"을 깨고 버텍스을 자유자재로 증감할 수 있는 기능을 가진 셰이더가 '지오메트리 셰이더'이다.
그림 1 : GPU 내부의 렌더링 흐름
버텍스 셰이더의 또 다른 일 ~ 버텍스 단위의 셰이딩(Shading)
그림 1의 [3]의 버텍스 셰이더의 일은 좌표 변환만이 아니다. 버텍스 단위의 셰이딩(Shading)/광원 처리(라이팅)도 버텍스 쉐이더의 중요한 일이 되고 있다.
「좌표 변환」은 「수학적」인 느낌이고, 「계산한다」, 라고 하는 이미지가 솟아 알기 쉽다. 하지만 컴퓨터 속에서 라이팅한다……즉 "빛을 비춘다"는 이미지는 솟아나기 어려울지도 모른다. 물론 GPU는 카메라가 아니라 계산기이므로 실제로 빛을 비추고 사진을 찍을 수도 있습니다. 계산을 해서 이것을 구하게 된다.
빛이 물체에 닿으면 빛은 거기에서 반사 / 확산되거나 흡수됩니다. 그 물건에 색이나 무늬가 붙어 있으면 그 색이 보일지도 모르고, 조명한 빛에 색이 붙어 있으면, 그 물건의 색이나 무늬와 합성된 색이 보일 것이다. 이러한 처리를 계산해 구하는 것이 컴퓨터 그래픽스의 기본적인 사고방식이다.
이 처리를 어떻게 계산기가 좋은 계산에 떨어뜨리는가? 이것도 실은 벡터 연산을 이용한다.
빛의 방향을 나타내는 「광원 벡터」와 시선의 방향을 나타내는 「시선 벡터」, 그리고 빛이 맞는 폴리곤을 구성하는 버텍스의 방향을 나타내는 「노멀 벡터」의 3개의 벡터를 이용해, 각각의 벡터의 상대 관계로부터 얼마나 빛이 시선 방향으로 반사하는지를 나타내는 반사 방정식을 이용해 계산해 주는 것이다.
이 반사 방정식에는, 표현하고 싶은 재질에 따라 다양한 종류가 있고, 이 반사 방정식을 프로그램으로서 표현한 것이 버텍스 쉐이더 프로그램이 된다. 그리고이 버텍스 단위의 반사 방정식 프로그램을 실행하는 것도 역시 버텍스 셰이더입니다.
버텍스 쉐이더에서는 버텍스 단위의 셰이딩(Shading)에 더하여 폴리곤에 붙여 넣는 텍스처 좌표의 계산도 행한다. 텍스처 좌표의 계산이란 어느 폴리곤에, 어느 텍스처를 어떻게 붙여 가는가 하는 대응을 계산하는 것. 덧붙여 실제로 텍스처 맵핑하는 것은 [8][9]의 픽셀 쉐이더의 시점에서, 여기에서는 텍스처 맵핑을 실시할 때의 준비한다, 라고 하는 이미지다.
그림
그림 3: 버텍스 셰이더 작업의 예: 버텍스 셰이더를 활용한 굴절 표현
지오메트리 셰이더~버텍스의 증감을 할 수 있는 굉장한 녀석
DirectX 9/SM3.0세대 이전의, 지오메트리 셰이더가 없는 세대의 GPU에서는, 3D모델의 버텍스 정보라고 하는 것은 CPU측의 소프트웨어로 미리 준비해 두는 것이고, 일단 GPU에 입력하면, 이것을 GPU측에서 마음대로 증감할 수 없었다.
그때까지의 "대원칙의 틀"을 깨고, 버텍스을 자유자재로 증감할 수 있는 기능을 가진 셰이더가 [4]의 「지오메트리 셰이더」가 된다.
어떻게 증가 또는 감소하는 지오메트리 셰이더가 실행할 셰이더 프로그램에 지정됩니다. 또한, 실제로 증감할 수 있는 것은 복수의 버텍스이 되기 때문에, 실질적으로는 선분, 폴리곤, 파티클 등의 각종 프리미티브의 증감이 가능해지고 있다.
지오메트리 셰이더의 활용 수법은 여러가지 생각되고 있지만, 폴리곤을 자유자재로 생성할 수 있으므로, 지면에 잔디가 되는 폴리곤을 낳거나, 혹은 3D 캐릭터에 털을 생길 수 있다는 것이 가장 기본적인 활용 방침이 된다. 게임 등에서는, 게임 로직과의 인터랙티브 처리가 별로 필요하지 않은, 불꽃 등의 이펙트 표현을, 지오메트리 쉐이더로 생성한 파티클로 표현한다…라고 하는 것도 할 수 있을 것이다
지오메트리 셰이더로 생성 된 버텍스은 다시 버텍스 셰이더로 되돌릴 수도 있으므로 재귀적인 버텍스 처리를 수행 할 수 있습니다. 예를 들어(실장은 일근줄로는 가지 않는다) 저폴리곤으로 생긴 바삭바삭한 3D 모델에서 지오메트리 셰이더로 폴리곤을 보간하여 둥근 폴리곤 모델을 생성한다.
작은 폴리곤 모델 (왼쪽)에서 산술적으로 폴리곤을 보완하여 다 폴리곤 모델 (오른쪽)으로 변형하는 활용도 생각할 수 있습니다.
그림 4 : 지오메트리 셰이더 작업의 예 : 지오메트리 셰이더로 머리카락을 만듭니다.
(트라이Z 니시카와 젠지)