의미 체계

의미 체계는 매개 변수의 의도된 사용에 대한 정보를 전달하는 셰이더 입력 또는 출력에 연결된 문자열입니다. 의미 체계는 셰이더 단계 간에 전달되는 모든 변수에 필요합니다. 셰이더 변수에 의미 체계를 추가하는 구문은 다음과 같습니다(변수 구문(DirectX HLSL)).

일반적으로 파이프라인 단계 간에 전달되는 데이터는 완전히 일반적이며 시스템에서 고유하게 해석되지 않습니다. 특별한 의미가 없는 임의의 의미 체계가 허용됩니다. 이러한 특수 의미 체계를 포함하는 매개 변수(Direct3D 10 이상)를 시스템 값 의미 체계라고 합니다.

Direct3D 9 및 Direct3D 10 이상에서 지원되는 의미 체계

다음 형식의 의미 체계는 Direct3D 9 및 Direct3D 10 이상에서 모두 지원됩니다.

꼭짓점 셰이더 의미 체계

이러한 의미 체계는 꼭짓점 셰이더 매개 변수에 연결될 때 의미가 있습니다. 이러한 의미 체계는 Direct3D 9 및 Direct3D 10 이상에서 모두 지원됩니다.

입력 Description Type
BINORMAL[n] Binormal float4
BLENDINDICES[n] 혼합 인덱스 uint
BLENDWEIGHT[n] 혼합 가중치 float
COLOR[n] 확산 및 반사 색상 float4
NORMAL[n] 법선 벡터 float4
POSITION[n] 개체 공간의 꼭짓점 위치입니다. float4
POSITIONT 변환된 꼭짓점 위치입니다. float4
PSIZE[n] 포인트 크기 float
TANGENT[n] 탄젠트 float4
TEXCOORD[n] 텍스처 좌표 float4
출력 Description Type
COLOR[n] 확산 또는 반사 색상 float4
FOG 꼭짓점 안개 float
POSITION[n] 균일한 공간에서 꼭짓점의 위치입니다. (x,y,z)를 w로 나누어 화면 공간에서의 위치를 계산합니다. 모든 꼭짓점 셰이더는 이 의미 체계로 매개 변수를 작성해야 합니다. 참고: 이 의미 체계는 Direct3D 9에서 사용할 수 있습니다. Direct3D 10 이상의 경우 SV_Position을 대신 사용합니다. float4
PSIZE 포인트 크기 float
TESSFACTOR[n] 테셀레이션 계수 float

n은 0과 지원되는 리소스 수 사이의 선택적 정수입니다. 예를 들어, POSITION0, TEXCOORD1 등입니다.

픽셀 셰이더 의미 체계

이러한 의미 체계는 픽셀 셰이더 입력 매개 변수에 연결될 때 의미가 있습니다. 이러한 의미 체계는 Direct3D 9 및 Direct3D 10 이상에서 모두 지원됩니다.

입력 Description Type
COLOR[n] 확산 또는 반사 색상입니다. float4
TEXCOORD[n] 텍스처 좌표 float4
VFACE 뒷면 기본 형식을 나타내는 부동 소수점 스칼라입니다. 음수 값은 뒤쪽을 향하고 양수 값은 카메라를 향합니다.

:
이 의미 체계는 Direct3D 9 셰이더 모델 3.0에서 사용할 수 있습니다. Direct3D 10 이상의 경우 SV_IsFrontFace를 대신 사용합니다.


float
VPOS 화면 공간의 픽셀 위치(x,y)입니다. Direct3D 9 셰이더(이 의미 체계 사용)를 Direct3D 10 이상 셰이더로 변환하려면 Direct3D 9 VPOS 및 Direct3D 10 SV_Position을 참조하세요 float2
출력 Description Type
COLOR[n] 출력 색상 float4
DEPTH[n] 출력 깊이 float

n은 0과 지원되는 리소스 수 사이의 선택적 정수입니다. 예를 들어, PSIZE0, COLOR1 등입니다.

COLOR 의미 체계는 셰이더 호환 모드에서만 유효합니다(즉, 셰이더가 D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY를 사용하여 만들어진 경우).

Direct3D 10 이상에서만 지원되는 의미 체계입니다.

다음 형식의 의미 체계는 Direct3D 10에 대해 새로 도입되었으며 Direct3D 9에서는 사용할 수 없습니다.

시스템 값 의미 체계

시스템 값 의미 체계는 Direct3D 10의 새로운 기능입니다. 모든 시스템 값은 SV_ 접두사로 시작하며 일반적인 예는 래스터라이저 단계에서 해석되는 SV_POSITION입니다. 시스템 값은 파이프라인의 다른 부분에서 유효합니다. 예를 들어, SV_Position은 꼭짓점 셰이더에 대한 입출력으로 지정할 수 있습니다. 픽셀 셰이더는 SV_Depth 및 SV_Target 시스템 값 의미 체계가 있는 매개 변수에만 쓸 수 있습니다.

다른 시스템 값(SV_VertexID, SV_InstanceID, SV_IsFrontFace)은 특정 값을 해석할 수 있는 파이프라인의 첫 번째 활성 셰이더에만 입력할 수 있습니다. 그 후 셰이더 함수는 값을 후속 단계로 전달해야 합니다.

SV_PrimitiveID는 특정 값을 해석할 수 있는 파이프라인의 첫 번째 활성 셰이더에만 입력되는 이 규칙의 예외입니다. 하드웨어는 헐 셰이더 단계, 도메인 셰이더 단계에 대한 입력과 동일한 ID 값을 제공할 수 있으며 그 이후에는 기하 도형 셰이더 단계 또는 픽셀 셰이더 단계 중 처음으로 사용하도록 설정된 단계가 제공됩니다.

테셀레이션이 사용하도록 설정된 경우 헐 셰이더 단계와 도메인 셰이더 단계가 있습니다. 지정된 패치의 경우 동일한 PrimitiveID가 패치의 헐 셰이더 호출 및 모든 테셀레이션된 도메인 셰이더 호출에 적용됩니다. 동일한 PrimitiveID도 다음 활성 단계로 전파됩니다. 사용하도록 설정된 경우 기하 도형 셰이더 단계 또는 픽셀 셰이더 단계입니다.

기하 도형 셰이더가 SV_PrimitiveID를 입력하고 호출당 0개 또는 하나 이상의 기본 형식을 출력할 수 있기 때문에 셰이더는 후속 픽셀 셰이더가 SV_PrimtiveID를 입력하는 경우 각 출력 기본 형식에 대해 자체적으로 선택한 SV_PrimitiveID 값을 프로그래밍해야 합니다.

또 다른 예로 SV_PrimitiveID는 꼭짓점이 여러 기본 형식의 멤버일 수 있기 때문에 꼭짓점 셰이더 단계에서 해석할 수 없습니다.

이러한 의미는 Direct3D 10에 추가되었습니다. Direct3D 9에서는 사용할 수 없습니다.

래스터라이저 단계의 시스템 값 의미 체계입니다.

시스템 값 의미 체계 설명 Type
SV_ClipDistance[n] 클립 거리 데이터입니다. SV_ClipDistance 값은 각각 평면까지의 float32 부호 있는 거리로 간주됩니다. 기본 설정은 보간된 평면 거리가 >= 0인 픽셀에서만 래스터화를 호출합니다. 하나 이상의 꼭짓점 요소의 여러 성분을 SV_ClipDistance로 선언하여 여러 클립 평면을 동시에 구현할 수 있습니다. 결합된 클립 및 컬 거리 값은 최대 D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT 레지스터의 최대 D3D#_CLIP_OR_CULL_DISTANCE_COUNT 성분입니다. 값을 쓸 수 있지만 입력으로 사용할 수 없는 꼭짓점 셰이더를 제외하고 모든 셰이더에서 읽거나 쓸 수 있습니다.
clipplanes 특성은 SV_ClipDistance처럼 작동하지만 모든 하드웨어 기능 수준 9_x 이상에서 작동합니다. 자세한 내용은 기능 수준 9 하드웨어의 사용자 클립 평면을 참조하세요.
float
SV_CullDistance[n] 컬 거리 데이터입니다. 꼭짓점 요소의 성분에 이 레이블이 지정되면 이 값은 각각 평면에 대한 float32 부호 있는 거리로 간주됩니다. 기본 형식의 모든 정점에 대한 평면 거리가 < 0인 경우 기본 형식은 완전히 삭제됩니다. 하나 이상의 꼭짓점 요소의 여러 성분을 SV_CullDistance로 선언하여 여러 컬 평면을 동시에 사용할 수 있습니다. 결합된 클립 및 컬 거리 값은 최대 D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT 레지스터의 최대 D3D#_CLIP_OR_CULL_DISTANCE_COUNT 성분입니다. 값을 쓸 수 있지만 입력으로 사용할 수 없는 꼭짓점 셰이더를 제외하고 모든 셰이더에서 읽거나 쓸 수 있습니다.
float
SV_Coverage 픽셀 셰이더의 입력, 출력 또는 둘 다에 지정할 수 있는 마스크입니다.
픽셀 셰이더의 SV_Coverage의 경우 ps_4_1 이상에서 OUTPUT이 지원됩니다.
픽셀 셰이더의 SV_Coverage의 경우 INPUT에는 ps_5_0 이상이 필요합니다.
uint
SV_Depth 깊이 버퍼 데이터입니다. 픽셀 셰이더로 작성할 수 있습니다. float
SV_DepthGreaterEqual 픽셀 셰이더에서 래스터라이저에 의해 결정된 값보다 크거나 같은 경우 깊이 출력을 허용합니다. 초기 Z를 사용하지 않도록 설정하지 않고 깊이 조정을 사용하도록 설정합니다. float
SV_DepthLessEqual 픽셀 셰이더에서 래스터라이저에 의해 결정된 값보다 작거나 같은 경우 깊이 출력을 허용합니다. 초기 Z를 사용하지 않도록 설정하지 않고 깊이 조정을 사용하도록 설정합니다. float
SV_DispatchThreadID 디스패치 호출 내에서 그룹 차원당 전역 스레드 오프셋을 정의합니다. 셰이더를 계산하기 위한 입력으로 사용할 수 있습니다. (읽기 전용) uint3
SV_DomainLocation 평가 중인 현재 도메인 지점의 헐 위치를 정의합니다. 도메인 셰이더에 대한 입력으로 사용할 수 있습니다. (읽기 전용) float2|3
SV_GroupID 디스패치 호출 차원별로 디스패치 호출 내의 그룹 오프셋을 정의합니다. 컴퓨팅 셰이더에 대한 입력으로 사용할 수 있습니다. (읽기 전용) uint3
SV_GroupIndex 지정된 그룹 내에서 지정된 스레드에 대해 평면화된 인덱스를 제공합니다. 컴퓨팅 셰이더에 대한 입력으로 사용할 수 있습니다. (읽기 전용) uint
SV_GroupThreadID 그룹 차원별로 그룹 내의 스레드 오프셋을 정의합니다. 컴퓨팅 셰이더에 대한 입력으로 사용할 수 있습니다. (읽기 전용) uint3
SV_GSInstanceID 기하 도형 셰이더의 인스턴스를 정의합니다. 기하 도형 셰이더에 대한 입력으로 사용할 수 있습니다. 형상 셰이더는 동일한 형상 기본 형식에서 최대 32번 호출될 수 있으므로 인스턴스가 필요합니다. uint
SV_InnerCoverage 과소 평가된 보수적 래스터화 정보(즉, 픽셀이 완전히 덮이도록 보장되는지 여부)를 나타냅니다. 픽셀 셰이더에서 읽거나 쓸 수 있습니다.
SV_InsideTessFactor 패치 표면 내의 테셀레이션 양을 정의합니다. 쓰기에는 헐 셰이더에서 사용할 수 있고 읽기에는 도메인 셰이더에서 사용할 수 있습니다. float|float[2]
SV_InstanceID 런타임에 의해 자동으로 생성된 인스턴스별 식별자입니다(시스템 생성 값 사용(Direct3D 10) 참조). 모든 셰이더에서 사용할 수 있습니다.
SV_IsFrontFace 삼각형이 전면을 향하는지 여부를 지정합니다. 선과 점의 경우 IsFrontFace 값은 true입니다. 예외는 삼각형(와이어프레임 모드)에서 그려진 선으로, 솔리드 모드에서 삼각형을 래스터화하는 것과 동일한 방식으로 IsFrontFace를 설정합니다. 기하 도형 셰이더에서 쓸 수 있고 픽셀 셰이더에서 읽을 수 있습니다. bool
SV_OutputControlPointID 헐 셰이더의 기본 진입점 호출에 의해 작동되는 제어점 ID의 인덱스를 정의합니다. 헐 셰이더에서만 읽을 수 있습니다. uint
SV_Position SV_Position이 셰이더에 대한 입력으로 선언되면 linearNoPerspective 또는 linearNoPerspectiveCentroid의 두 보간 모드 중 하나를 지정할 수 있습니다. 여기서 후자는 다중 샘플 앤티앨리어싱 시 중심 스냅된 xyzw 값을 제공합니다. 셰이더에서 사용되는 경우 SV_Position은 픽셀 위치를 설명합니다. 0.5 오프셋으로 픽셀 중심을 가져오기 위해 모든 셰이더에서 사용할 수 있습니다. float4
SV_PrimitiveID 런타임에 의해 자동으로 생성된 기본 형식별 식별자입니다(시스템 생성 값 사용(Direct3D 10) 참조). 기하 도형 또는 픽셀 셰이더로 쓸 수 있고 기하 도형, 픽셀, 헐 또는 도메인 셰이더로 읽을 수 있습니다. uint
SV_RenderTargetArrayIndex 렌더링 대상 배열 인덱스입니다. 기하 도형 셰이더 출력에 적용되며 픽셀 셰이더에 의해 기본 형식이 그려질 렌더링 대상 배열 슬라이스를 나타냅니다. SV_RenderTargetArrayIndex는 렌더링 대상이 배열 리소스인 경우에만 유효합니다. 이 의미 체계는 기본 형식에만 적용됩니다. 기본 형식에 꼭짓점이 두 개 이상 있으면 선행 꼭짓점의 값이 사용됩니다. 이 값은 읽기/쓰기 목적으로 사용되는 깊이/스텐실 보기의 배열 조각도 나타냅니다.
기하 도형 셰이더에서 작성하고 픽셀 셰이더에서 읽을 수 있습니다.
D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizertrue인 경우 SV_RenderTargetArrayIndex는 래스터라이저를 공급하는 모든 셰이더에 적용됩니다.
uint
SV_SampleIndex 샘플 주파수 인덱스 데이터입니다. 픽셀 셰이더에서만 읽거나 쓸 수 있습니다. uint
SV_StencilRef 현재 픽셀 셰이더 스텐실 참조 값을 나타냅니다. 픽셀 셰이더에서만 쓸 수 있습니다. uint
SV_Target[n], 여기서 0 <= n <= 7 렌더링 대상에 저장될 출력 값입니다. 인덱스는 바인딩된 8개의 렌더링 대상 중 쓰기 대상을 나타냅니다. 이 값은 모든 셰이더에서 사용할 수 있습니다. float[2|3|4]
SV_TessFactor 패치의 각 에지에 테셀레이션 양을 정의합니다. 헐 셰이더에서 쓰고 도메인 셰이더에서 읽을 수 있습니다. float[2|3|4]
SV_VertexID 런타임에 의해 자동으로 생성된 꼭짓점별 식별자입니다(시스템 생성 값 사용(Direct3D 10) 참조). 꼭짓점 셰이더에 대한 입력으로만 사용할 수 있습니다. uint
SV_ViewportArrayIndex 뷰포트 배열 인덱스입니다. 기하 도형 셰이더 출력에 적용되며 현재 작성 중인 기본 형식에 사용할 뷰포트를 나타냅니다. 픽셀 셰이더에서 읽을 수 있습니다. 기본 형식은 래스터라이저로 전달되기 전에 인덱스에 의해 지정된 뷰포트에 대해 변환되고 잘립니다. 이 의미 체계는 기본 형식에만 적용됩니다. 기본 형식에 꼭짓점이 두 개 이상 있으면 선행 꼭짓점의 값이 사용됩니다.
D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizertrue이면 SV_ViewportArrayIndex가 래스터라이저를 공급하는 모든 셰이더에 적용됩니다.
uint
SV_ShadingRate 음영 속도 을 통해 가변 음영 속도 계층 2 이상의 디바이스에 대해 하나의 픽셀 셰이더 호출로 기록되는 픽셀 수를 정의합니다. 픽셀 셰이더에서 읽을 수 있습니다. 꼭짓점 또는 기하 도형 셰이더에서 작성할 수 있습니다. uint

SV_Depth 작성 시 제한 사항:

  • 멀티샘플링(D3D10_RASTERIZER_DESC에서 MultisampleEnable이 TRUE임) 및 깊이 값을 쓸 때(픽셀 셰이더 사용) 기록된 단일 값은 깊이 테스트에도 사용됩니다. 따라서 멀티샘플링 시 기본 에지를 더 높은 해상도로 렌더링하는 기능이 손실됩니다.
  • 동적 흐름 제어를 사용하는 경우 일부 경로에서 SV_Depth를 쓰는 셰이더가 모든 실행에서 SV_Depth를 쓰는 것이 보장되는지 여부를 컴파일 시간에 결정할 수 없습니다. 선언 시 SV_Depth를 쓰지 않으면 정의되지 않은 동작이 발생합니다(픽셀 삭제가 포함될 수도 있고 포함되지 않을 수도 있음).
  • +/-INF 및 NaN을 포함한 모든 float32 값은 SV_Depth에 쓸 수 있습니다.
  • SV_Depth 쓰기는 이중 원본 색상 혼합을 수행할 때 여전히 유효합니다.

Direct3D 9에서 Direct3D 10 이상으로 마이그레이션

Direct3D 9에서 Direct3D 10 이상으로 코드를 마이그레이션할 때 다음 문제를 고려해야 합니다.

Direct3D 9 의미 체계에 매핑

Direct3D 10 이상의 의미 체계 중 일부는 Direct3D 9 의미 체계에 직접 매핑됩니다.

Direct3D 10 의미 체계 Direct3D 9 동등한 의미 체계
SV_Depth DEPTH
SV_Position POSITION
SV_Target COLOR

[!] Direct3D 9 개발자 참고 사항: Direct3D 9 대상의 경우 셰이더 의미 체계가 유효한 Direct3D 9 의미 체계에 매핑되어야 합니다. 이전 버전과의 호환성을 위해 FXC는 POSITION0(및 변형 이름)을 SV_Position으로 처리합니다. FXC는 COLOR를 SV_TARGET로 처리합니다. DXC 및 최신 컴파일러는 POSITION[n] 및 COLOR를 사용자 정의 의미 체계로 간주합니다.

Direct3D 9 VPOS 및 Direct3D 10 SV_Position

D3D10 의미 체계 SV_Position은 Direct3D 9 셰이더 모델 3 VPOS 의미 체계와 유사한 기능을 제공합니다. 예를 들어, Direct3D 9에서는 화면 공간 좌표를 사용하는 픽셀 셰이더에 다음 구문이 사용됩니다.

float4 psMainD3D9( float4 screenSpace : VPOS ) : COLOR
{
    // code here 
}

VPOS는 셰이더 모델 3 지원을 위해 추가되어 화면 공간 좌표를 지정합니다. POSITION 의미 체계는 개체 공간 좌표를 위한 것이기 때문입니다.

Direct3D 10 이상에서 SV_Position 의미 체계(픽셀 셰이더 컨텍스트에서 사용되는 경우)는 화면 공간 좌표(오프셋 0.5)를 지정합니다. 따라서 Direct3D 9 셰이더는 대략 다음과 동일합니다(0.5 오프셋을 고려하지 않음).

float4 psMainD3D10( float4 screenSpace : SV_Position ) : COLOR
{
    // code here
}

Direct3D 9에서 Direct3D 10 이상으로 마이그레이션할 때 셰이더를 변환할 때 이를 알고 있어야 합니다.

HLSL의 사용자 클립 평면

Windows 8부터는 SV_ClipDistance 대신 HLSL 함수 선언에서 clipplanes 함수 특성을 사용하여 셰이더가 기능 수준 9_x 및 기능 수준 10 이상에서 작동하도록 합니다. 자세한 내용은 기능 수준 9 하드웨어의 사용자 클립 평면을 참조하세요.