기하 도형 셰이더 단계

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

기하 도형 셰이더 입력 기본 형식의 예를 보여 주는 다이어그램

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

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

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

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

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

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

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

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

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

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

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

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

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