Hull, Domain 및 Geometry 셰이더는 무엇에 사용됩니까?


21

나는 (이전의) 고용주를위한 3D 게임 프로그래밍과 나의 인디 게임을위한 나만의 커스텀 엔진을 공정하게 공유했습니다.

처음에는 Direct3D 9와 D3DX9로 시작했습니다. D3DX9는 거의 모든 작업을 수행했으며 셰이더 측면에서 전혀 생각할 필요가 없었습니다.

그 후 첫 Direct3D 9 셰이더를 작성했지만 대부분 내가 한 모든 작업에 매우 간단한 셰이더를 사용했습니다.

내 게임 엔진의 최신 반복에서 Direct3D 11로 이동하여 그와 함께 많은 셰이더를 만들었습니다. GPU에서 GPU 스키닝, GPU 계산 입자, 많은 조명 및 사후 처리 효과를 모두 수행했습니다. 정말 멋진 물건.

지금까지 정점 및 픽셀 / 조각 셰이더 만 사용했습니다. 여전히 아직 수행하지 않은 작업이 많이 있지만 정점 및 픽셀 / 조각 셰이더의 기능과이 기능이 전체 3D 파이프 라인에 어떻게 적용되는지 확실하게 알고 있습니다.

최신 개발에 따라 새로운 셰이더 단계에 관심을 갖게되었습니다. 즉, Geometry Shader, 심지어 최신 Hull 및 Domain 셰이더입니다.

필자는이 단계를 사용한 적이 없지만 지오메트리 셰이더는 활성화 된 경우 버텍스 셰이더 다음에 각 변환 된 버텍스마다 (또는 프리미티브 당 한 번) 실행되고 버텍스 (및 프리미티브?)를 버릴 수 있습니다. , 새로운 것을 만듭니다 (파이프 라인의 시작으로 돌아가는 것 같습니까?).

지오메트리 쉐이더의 주된 용도는 프로그래밍 방식으로 GPU에서 지오메트리를 생성하는 것입니다. 일반적인 사용법은 단일 정점을 기반으로 빌보드 쿼드를 만드는 것이지만 프랙탈을 생성하고 프로그래밍 방식으로 100 % 생성 할 수있는 다른 것들을 제외하고는 다른 많은 일반적인 시나리오를 실제로 시각화하지는 않습니다.

헐 및 도메인 셰이더는 테셀레이션과 관련이있는 것으로 보이며 (거친 표면에서 매끄러운 표면을 생성합니까?) 함께 사용하거나 전혀 사용하지 않아야합니다. "패치"라는 용어도 여기에서 일반적으로 보입니다.

누구든지이 새로운 쉐이더 스테이지가 무엇인지, 3D 파이프 라인에 어떻게 적용되는지, 어떤 경우에 사용해야하는지 실용적으로 설명해 주어야합니까?


나는 당신이 "무엇을 위해 사용 되는가"보다는 잘못된 길을 요구하고 있다고 생각합니다. "무엇을하는지"를 물어봐야합니다. 만약 당신이 주어진 자원 (및 그들의 하위 개념)을 이해한다면 오직 하늘 만이 당신이 무엇인지 제한합니다. 실제로 그들과 함께 할 수 있습니다.
wondra

@wondra : 거의 같은 질문이지만, 실제 작업 샘플에 대한 이론적 설명보다는 실제 사용 샘플에 더 초점을 맞추고 싶습니다. 사실, MSDN에는 여러 번 읽은 개요가 있지만 여전히 그들이 나를 위해 무엇을 할 수 있는지 이해할 수 없습니다. 나는 지능적인 존재이며 A와 B를 연결하고 그로부터 C, D, E와 F를 알아낼 수 있습니다.
Panda Pajama

"실제 사용 예"는 제게 다소 넓은 것 같습니다. 나는 그것을 찌르지 만,이 의견 전에는 "당신이하는 일"에 너무 집중하고있을 수 있습니다.

@ 조쉬 : 현실 세계에서이 단계들을 사용하셨습니까, 아니면 사용 했습니까?
팬더 파자마

1
DirectX 이외의 배경 (자신과 같은)을 가진 사람들을위한 FYI는 OpenGL과 Vulkan에서 "테셀레이션 컨트롤 셰이더"와 "테셀레이션 평가 셰이더"라고합니다.
Shahbaz

답변:


13

선체 및 도메인

선체 및 도메인 셰이더 단계는 GPU의 테셀레이션 파이프 라인의 일부입니다. 그것들은 일반적으로 삼각형 또는 쿼드 (eter tera)로 정의되는 낮은 세부 입력 표면 형상을 기반으로 매우 상세한 표면 형상을 계산하는 데 사용됩니다. 하위 상세 입력 프리미티브를 "패치"라고하며, 최종적으로 존재할 실제 지오메트리 를 나타내지 않을 수도 있습니다. 표면을 제외하고 베 지어 곡선의 제어점과 더 비슷하다고 생각하십시오.

선체 셰이더는 입력 패치를 가져 와서 출력 패치 (또는 패치; 패치의 세분화가 일반적으로 발생하는 위치)를 생성합니다. 패치에 대한 일정한 메타 데이터는 또한 선체 셰이더 내에서 계산되어 파이프 라인의 이후 단계에서 처리 될 수 있습니다.

선체 셰이더의 출력은 (고정 기능) 테셀레이션 단계를 거쳐 적절한 유형의 타일, 정규화 된 도메인 (예 : 쿼드 또는 삼각형)을 생성합니다.

위에서 언급 한 테셀레이션으로 인해 도메인에서 특정 지점의 실제 정점 위치를 계산하기 위해 도메인 셰이더가 이러한 도메인에 대해 실행됩니다. 도메인 쉐이더는 따라서 정점 위치를 출력합니다.

테셀레이션 단계는 파이프 라인에서 정점 셰이더 단계 후에 발생합니다.

지오메트리 쉐이더

지오메트리 셰이더는 단순화 된 선체 / 도메인 셰이더와 비슷합니다. 단순히 입력 정점을 가져 와서 출력 정점을 생성합니다. 주어진 입력 정점에 대해 많은 출력 정점이 생성 될 수 있으므로 "지오메트리 생성"에 사용될 수 있습니다.

지오메트리 셰이더 단계는 정점 셰이더 이후 및 테셀레이션 단계 후에 발생합니다.

용도

지오메트리 쉐이더는 파이프 라인의 래스터 화 및 프래그먼트 쉐이딩 단계로 직접 공급되는 대신 스트림 출력 버퍼에 쓸 수 있습니다. 이는 파이프 라인을 통해 버텍스 / 헐 / 도메인 / 지오메트리 셰이더 반복의 조합으로 생성 된 지오메트리를 다시 실행하여 다른 버텍스 셰이더 단계 등에서 추가 작업을 수행 할 수 있음을 의미합니다.

무엇 정말 그 주소를 시도하지 않도록 당신이 다음을 사용할 수있는 것은, 다소 광범위하고 효율적으로 무제한 주제입니다. 그러나 이들을 사용하는 것을 고려해야하는 동기 부여 이유는 ...이 셰이더 단계의 가장 큰 장점은 항상 메모리 또는 대역폭 비용을 지불하지 않고도 잠재적으로 상당히 많은 추가 세부 정보를 얻을 수 있다는 것입니다. 또한 CPU에서 GPU로 처리를 이동합니다.

지형은 일반적으로 매우 가까이 (캐릭터가 서있는 상태) 멀리 떨어진 (먼 거리의 산) 볼 수 있어야하기 때문에이 기술 중 일부를 사용하려는 경우의 좋은 예입니다. 이 셰이더 단계를 통해 "즉석에서"지형 지오메트리에 배치 할 디테일과 크기를 매우 강력하게 제어 할 수 있습니다. 대안은 역사적으로 항상 지형에 일정한 평균 비용을 지불하거나 (최소 공통 분모 접근) GPU 메모리 안팎에서 서로 다른 세부 수준의 지오메트리 청크를 수동으로 페이징하는 것입니다. 비싼.

합리적으로 세분화 할 수있는 일부 메쉬 또는 모델에 대해 지원해야하는 매우 광범위한 세부 수준이있을 수있는 유사한 상황은 이러한 셰이더를 사용하여 영리한 작업을 수행 할 수 있습니다. 그러나 모든 것이 세분화 표면 스타일 최적화 로 잘 해석되는 것은 아닙니다 . 천과 머리카락에도 사용할 수 있습니다.

합리적으로 기억하거나 여기에 들어갈 수있는 것보다 훨씬 자세한 내용을 포함하여 더 읽을 거리가 있습니다 :


4
선체 및 도메인 셰이더에는 Direct3D 기능 수준 11.0 이상의 하드웨어가 필요하고 지오메트리 셰이더에는 Direct3D 기능 수준 10.0 이상의 하드웨어가 필요합니다. 또한 대부분의 비디오 카드 디자인은 지오메트리 쉐이더 스테이지에 전용 하드웨어를 거의 또는 전혀 제공하지 않으므로 실제로는 원래 의도했던 것보다 훨씬 유용합니다.
척 Walbourn

@ChuckWalbourn : 원한다면 별도의 답변으로 더 많은 것을 듣고 싶습니다
Panda Pajama
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.