본문 바로가기

Library/Computer Graphics

D3D10 Pipeline : Geometry Shader Stage

지오메트리 쉐이더(geometry shader) 스테이지는 버텍스를 입력으로 받고, 출력으로 버텍스를 생성할 수 있는, 프로그램이 정의한 쉐이더 코드를 실행한다. 하나의 버텍스에 대해서만 동작하는 버텍스 쉐이더와 달리, 지오메트리 쉐이더는 하나의 완전한 프리미티브를 구성하는 모든 버텍스를 입력으로 받는다. 또, 지오메트리 쉐이더는 인접한 프리미티브들의 버텍스들도 입력으로 가져올 수 있다.

지오메트리 쉐이더는 IA 스테이지에서 생성된 값(시멘틱) SV_PrimitiveID를 사용한다. 이것은, 각 프리미티브 데이터가 그냥 보내질 것인지, 아니면 계산될 것인지 결정할 수 있다.

지오메트리 쉐이더는, 선택된 단일한 위상을 형성하는 여러 개의 버텍스을 출력하는 능력을 가진다. 지오메트리 쉐이더의 호출(invocation) 과정에서, 생략되는 프리미티브들의 수는, 생략되는 버텍스의 수를 정적으로 최대로 지정한다고 하더라도 다양한 값을 가질 수 있다. 지오메트리 쉐이더 호출 중에 생략되는 스트립(strip) 길이는 임의적이며, RestartStrip HLSL 함수를 통해 새로운 스트립들이 생성될 수도 있다.

지오메트리 쉐이더의 결과물은 래스터라이저 스테이지, 또는 스트림 아웃풋(stream output) 스테이지를 통해 메모리에 있는 버텍스 데이터에 다시 피드될 수 있다. 메모리로 피드되는 출력물은 각각의 점, 선, 삼각형 리스트로 연장된다. (래스터라이저로 넘겨지는 것과 정확하게 동일하다)

지오메트리 쉐이더가 활성화되면, 지오메트리 쉐이더는 파이프라인의 전 단계에서 생성되거나 넘어온 모든 프리미티브들에 대해 한번씩 호출된다. 지오메트리 쉐이더의 각 호출은, 해당 프리미티브가 점인지, 선인지, 삼각형인지 상관하지 않고 이것을 입력으로 간주한다. 파이프라인의 전 단계에서의 삼각형 스트립은, 스트립의 각 삼각형에 대해 지오메트리 쉐이더를 한번씩 호출하는 결과를 가진다. 각 프리미티브들의 버텍스에 대해 모든 입력 데이터가 유효하고, 이 프리미티브의 인접 정보가 적용 가능하거나 유효하다면 인접 정보까지 해당된다.

지오메트리 쉐이더는 출력 스트림 개체에 한번에 하나의 버텍스에 버텍스를 추가하는 것으로 데이터를 출력한다. 출력 스트림의 위상은 고정된 선언(GS의 출력 형식으로 PointStream, LineStream, TriangleStream에서 선택되어야 한다)으로 결정되어야 한다.

지오메트리 쉐이더의 실행은, 스트림으로의 데이터 추가가 직렬화라는 점을 제외하면, 다른 지오메트리 쉐이더 호출과 상관없는 단위 동작(atomic)이다. 삼각형을 생성하는 지오메트리 쉐이더는 모든 호출에서 새로운 스트립을 시작할 것이다.

지오메트리 쉐이더의 결과물이 시스템에서 해석되는 값(SV_RenderTargetArrayindex, 또는 SV_Position)으로 정의되었을 때, 하드웨어는 이들 데이터를 보고 이 값에 의존적인 동작을 수행하거나, 다음 스테이지에 데이터를 넘길 수 있다. 지오메트리 쉐이더의 이러한 출력 데이터는 버텍스 기반적인 데이터(SV_CllipDistance, 또는 SV_Posiotion과 같은)라기보다는 프리미티브 기반적인 데이터(SV_RenderTargetArrayIndex, 또는 SV_ViewportArrayindex)로 의미를 가진다. 각 프리미티브 데이터는 이 프리미티브들에 대해, 생략된 리딩 버텍스로부터 가져오게 된다.

만약, 지오메트리 쉐이더 처리가 종료되거나 프리미티브가 완전하게 완성되지 않았다면, 부분적으로만 완성된 프리미티브가 생성될 수 있다. 이렇게 부분적으로만 완성된 프리미티브들은 '조용하게' 무시되며, 이것은 IA 스테이지가 부분적으로만 완성된 프리미티브들을 다루는 방식과 유사하다.

지오메트리 쉐이더는 스크린 공간과 연관되지 않는 작업이나 텍스처 샘플링과 같은 작업을 수행할 수 있다.


Translated from
http://msdn.microsoft.com/en-us/library/ee415747(VS.85).aspx#Geometry_Shader_Stage