기하 도형 셰이더 단계

GS(기하 도형 셰이더) 단계는 꼭짓점을 입력으로 사용하여 애플리케이션 지정 셰이더 코드를 실행하고 출력에 꼭짓점을 생성할 수 있습니다. 단일 꼭짓점에서 작동하는 꼭짓점 셰이더와 달리 기하 도형 셰이더의 입력은 전체 기본 형식(즉, 선에 대한 두 개의 꼭짓점, 삼각형의 경우 3개 꼭짓점 또는 한 점의 단일 꼭짓점)에 대한 꼭짓점 데이터와 가장자리 인접 기본 형식의 꼭짓점 데이터(즉, 선에 대한 두 개의 꼭짓점 또는 삼각형에 대한 추가 3개의 꼭짓점)에 대한 꼭짓점입니다. 다음 그림에서는 기하 도형 셰이더에 입력되는 기본 형식의 예를 보여 줍니다.

diagram illustrating geometry shader primitives.

기하 도형 셰이더에 대한 또 다른 입력은 IA(입력 어셈블러)에 의해 자동으로 생성되는 기본 ID입니다. 기본 ID를 사용하면 기하 도형 셰이더가 필요한 경우 얼굴별 데이터를 가져오거나 계산할 수 있습니다.

기하 도형 셰이더 단계는 여러 꼭짓점을 출력하여 선택한 단일 토폴로지를 형성할 수 있습니다. 사용 가능한 GS 출력 토폴로지는 tristrip, linestrippointlist입니다. 기하 도형 셰이더가 내보낼 수 있는 최대 꼭짓점 수는 정적으로 선언되어야 하지만 기하 도형 셰이더가 내보내는 기본 형식의 수는 다를 수 있습니다. 기하 도형 셰이더가 내보내는 스트립 길이는 임의일 수 있습니다( 잘라내 기 명령이 있습니다).

기하 도형 셰이더의 출력은 래스터라이저 및 메모리의 꼭짓점 버퍼로 보낼 수 있습니다. 메모리로 전송되는 출력은 개별 점, 선 및 삼각형 목록으로 확장됩니다(출력이 래스터라이저에 전달되는 방식과 유사함).

기하 도형 셰이더 단계에서는 다음 알고리즘을 구현할 수 있습니다.

  • 점 스프라이트 테셀레이션: 셰이더는 단일 꼭짓점을 사용하고 임의의 텍스코드, 법선 및 기타 특성이 있는 쿼드의 네 모서리를 나타내는 4개의 꼭짓점(두 개의 출력 삼각형)을 생성합니다.

  • 와이드 라인 테셀레이션: 셰이더는 두 개의 선 꼭짓점(LV0 및 LV1)을 수신하고 확대된 선을 나타내는 쿼드에 대해 4개의 꼭짓점을 생성합니다. 또한 기하 도형 셰이더는 인접한 선 꼭짓점(AV0 및 AV1)을 사용하여 선 엔드포인트에서 완화를 수행할 수 있습니다.

  • 모피/핀 생성: 여러 텍스처(압출된 얼굴)를 사용하여 잠재적으로 여러 오프셋을 렌더링하여 모피의 기생 효과를 시뮬레이션합니다. 지느러미는 각도가 경사가 아닌 경우 종종 페이드 아웃되는 돌출된 가장자리입니다. 지느러미는 오블리크 각도에서 개체를 더 잘 보이게 하는 데 사용됩니다.

  • 섀도 볼륨 생성: 돌출 여부를 결정하는 데 사용되는 인접 정보입니다.

  • 여러 텍스처 큐브 면에 단일 패스 렌더링: 기본 형식이 프로젝션되어 픽셀 셰이더에 6번 내보내집니다. 각 기본 형식에는 큐브 얼굴을 선택하는 렌더링 대상 배열 인덱스가 함께 제공됩니다.

  • 픽셀 셰이더가 사용자 지정 특성 보간을 수행할 수 있도록 기본 데이터로 막대 중심 좌표를 설정합니다.

  • 병리학적 사례: 애플리케이션은 일부 기하 도형을 생성한 다음, 해당 기하 도형을 n 패치한 다음 해당 기하 도형에서 그림자 볼륨을 돌출합니다. 이러한 경우 다중 패스는 꼭짓점 및 기본 데이터를 스트림에 출력하고 데이터를 다시 순환하는 기능을 갖춘 솔루션입니다.

참고 기하 도형 셰이더에 대한 각 호출은 다양한 수의 출력을 생성할 수 있으므로 이 단계에서 하드웨어에 대한 병렬 호출은 다른 파이프라인 단계(예: 꼭짓점 또는 픽셀 셰이더 단계)를 병렬로 실행하는 경우보다 더 어렵습니다. 하드웨어 구현은 기하 도형 셰이더 호출을 병렬로 실행하지만 병렬 기하 도형 셰이더 호출을 수행하는 데 필요한 복잡한 버퍼링은 애플리케이션이 기하 도형 셰이더 단계에서 달성할 수 있는 병렬 처리 수준을 다른 파이프라인 단계만큼 요구하지 않아야 한다는 것을 의미합니다. 즉, 기하 도형 셰이더는 기하 도형 셰이더에 있는 프로그램 로드에 따라 파이프라인에서 병목 상태가 될 수 있습니다. 그러나 기하 도형 셰이더의 기능을 사용하는 알고리즘은 프로그래밍 방식으로 기하 도형을 생성할 수 없는 하드웨어의 동작을 에뮬레이트해야 하는 애플리케이션보다 더 효율적으로 실행되는 것이 목표입니다.

Direct3D 런타임은 다음 드라이버 함수를 호출하여 기하 도형 셰이더를 만들고, 설정하고, 삭제합니다.

CalcPrivateGeometryShaderWithStreamOutput

CalcPrivateShaderSize

CreateGeometryShader

CreateGeometryShaderWithStreamOutput

DestroyShader

GsSetConstantBuffers

GsSetSamplers

GsSetShader

GsSetShaderResources