그래픽스

SV_ POSITION vs POSITION

대게 2025. 5. 19. 13:45

Direct 10부터 지원되는 SV_접미사가 붙은 시멘틱.. 의 의미가 무엇일까요

 

일단 공식 문서를 봅시다
https://learn.microsoft.com/ko-kr/windows/win32/direct3dhlsl/dx-graphics-hlsl-semantics

 

의미론 - Win32 apps

의미 체계는 매개 변수의 의도된 사용에 대한 정보를 전달하는 셰이더 입력 또는 출력에 연결된 문자열입니다.

learn.microsoft.com

 

시멘틱

: 시멘틱은 컴파일러에게 구조체의 특정 멤버가 어떤 종류의 정보(이 데이터의 의도)를 저장하는지 알려줍니다.

입출력 구조체 선언에서 : 뒤에 오는 단어들입니다. 변수명은 마음대로 정할 수 있지만 시멘틱은 미리 정의되어있는 형태 그대로 써야합니다.

 

 

 

기본적인 시멘틱들을 알아보면 아래와 같습니다.

 

Vertex Shader Semantics

input

BINORMAL[n] Binormal float4
BLENDINDICES[n] Blend indices uint
BLENDWEIGHT[n] Blend weights float
COLOR[n] Diffuse and specular color float4
NORMAL[n] Normal vector float4
POSITION[n] Vertex position in object space. float4
POSITIONT Transformed vertex position. float4
PSIZE[n] Point size float
TANGENT[n] Tangent float4
TEXCOORD[n] Texture coordinates float4

 

output

COLOR[n] Diffuse or specular color float4
FOG Vertex fog float
POSITION[n] Position of a vertex in homogenous space. Compute position in screen-space by dividing (x,y,z) by w. Every vertex shader must write out a parameter with this semantic. NOTE: This semantic is available in Direct3D 9. For Direct3D 10 and later, use SV_Position instead. float4
PSIZE Point size float
TESSFACTOR[n] Tessellation factor float


Pixel Shader Semantics

Input

COLOR[n] Diffuse or specular color. float4
TEXCOORD[n] Texture coordinates float4
VFACE Floating-point scalar that indicates a back-facing primitive. A negative value faces backwards, while a positive value faces the camera.Note:
This semantic is available in Direct3D 9 Shader Model 3.0. For Direct3D 10 and later, use SV_IsFrontFace instead.


float
VPOS The pixel location (x,y) in screen space. To convert a Direct3D 9 shader (that uses this semantic) to a Direct3D 10 and later shader, see Direct3D 9 VPOS and Direct3D 10 SV_Position) float2

 

output

COLOR[n] Output color float4
DEPTH[n] Output depth float

 

 

 

 


SV_시멘틱

System-Value semantics는 렌더링파이프라인 상에서 의미가 정해져있는 시멘틱입니다.

사용자가 임의로 설정하는 변수나 각 셰이더들의 입/출력 구조체들의 변수들이 어느 자료와 이어지는지 알려주기 위해 더 세분화 시켰다는 것 같습니다.

 

공식문서의 설명을 보면 각 시멘틱마다 의미와 어디서 사용 가능한지 나와있습니다.

SV_ClipDistance[n] 거리 데이터를 클리핑합니다. SV_ClipDistance 값은 각각 평면에 부가된 float32 거리로 간주됩니다. 기본 설정은 보간된 평면 거리가 >= 0인 픽셀에서만 래스터화를 호출합니다. 하나 이상의 꼭짓점 요소의 여러 구성 요소를 SV_ClipDistance 선언하여 여러 클립 평면을 동시에 구현할 수 있습니다. 결합된 클립 및 컬 거리 값은 최대 D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT 레지스터의 최대 D3D#_CLIP_OR_CULL_DISTANCE_COUNT 구성 요소입니다. 값을 작성할 수 있지만 입력으로 사용할 수 없는 꼭짓점 셰이더를 제외한 모든 셰이더에서 읽거나 쓸 수 있습니다.
클립플레인 특성은 SV_ClipDistance 작동하지만 모든 하드웨어 기능 수준 9_x 이상에서 작동합니다. 자세한 내용은 기능 수준 9 하드웨어 사용자 클립 평면을 참조하세요.
뜨다
SV_CullDistance[n] 거리 데이터를 컬링합니다. 꼭짓점 요소의 구성 요소에 이 레이블이 지정되면 이러한 값은 각각 평면에 부호 있는 float32 간격으로 간주됩니다. 기본 형식의 모든 꼭짓점의 평면 거리가 < 0이면 기본 형식이 완전히 삭제됩니다. 하나 이상의 꼭짓점 요소의 여러 구성 요소를 SV_CullDistance 선언하여 여러 컬 평면을 동시에 사용할 수 있습니다. 결합된 클립 및 컬 거리 값은 최대 D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT 레지스터의 최대 D3D#_CLIP_OR_CULL_DISTANCE_COUNT 구성 요소입니다. 값을 작성할 수 있지만 입력으로 사용할 수 없는 꼭짓점 셰이더를 제외한 모든 셰이더에서 읽거나 쓸 수 있습니다. 뜨다
SV_Coverage 입력, 출력 또는 픽셀 셰이더 둘 다에 지정할 수 있는 마스크입니다.
픽셀 셰이더에서 SV_Coverage 경우 출력은 ps_4_1 이상에서 지원됩니다.
픽셀 셰이더에서 SV_Coverage 경우 INPUT에는 ps_5_0 이상이 필요합니다.
uint
SV_Depth 깊이 버퍼 데이터입니다. 픽셀 셰이더로 작성할 수 있습니다. 뜨다
SV_DepthGreaterEqual 픽셀 셰이더에서 래스터라이저에 의해 결정된 값보다 크거나 같은 경우 출력 깊이를 허용합니다. 초기 Z를 사용하지 않도록 설정하지 않고 깊이를 조정할 수 있습니다. 뜨다
SV_DepthLessEqual 픽셀 셰이더에서 래스터라이저에 의해 결정된 값보다 작거나 같은 경우 출력 깊이를 허용합니다. 초기 Z를 사용하지 않도록 설정하지 않고 깊이를 조정할 수 있습니다. 뜨다
SV_DispatchThreadID 디스패치 호출 내에서 그룹 차원당 전역 스레드 오프셋을 정의합니다. 컴퓨팅 셰이더에 대한 입력으로 사용할 수 있습니다. (읽기 전용) uint3
SV_DomainLocation 평가되는 현재 도메인 지점의 헐 위치를 정의합니다. 도메인 셰이더에 대한 입력으로 사용할 수 있습니다. (읽기 전용) float2|3
SV_GroupID 디스패치 호출의 차원당 디스패치 호출 내에서 그룹 오프셋을 정의합니다. 컴퓨팅 셰이더에 대한 입력으로 사용할 수 있습니다. (읽기 전용) uint3
SV_GroupIndex 지정된 그룹 내의 지정된 스레드에 대해 평면화된 인덱스 제공 컴퓨팅 셰이더에 대한 입력으로 사용할 수 있습니다. (읽기 전용) uint
SV_GroupThreadID 그룹 차원당 그룹 내의 스레드 오프셋을 정의합니다. 컴퓨팅 셰이더에 대한 입력으로 사용할 수 있습니다. (읽기 전용) uint3
SV_GSInstanceID 기하 도형 셰이더의 인스턴스를 정의합니다. 기하 도형 셰이더에 대한 입력으로 사용할 수 있습니다. 동일한 기하 도형 기본 형식에서 기하 도형 셰이더를 최대 32번 호출할 수 있으므로 인스턴스가 필요합니다. uint
SV_InnerCoverage 과소 평가된 보수적 래스터화 정보(즉, 픽셀이 보장되는지 여부-to-be완전히 덮여 있는지 여부)를 나타냅니다. 픽셀 셰이더에서 읽거나 쓸 수 있습니다.  
SV_InsideTessFactor 패치 표면 내의 공간 분할 크기를 정의합니다. 헐 셰이더에서 쓰기용으로 사용할 수 있으며 읽기 위해 도메인 셰이더에서 사용할 수 있습니다. float|float[2]
SV_InstanceID 런타임에서 자동으로 생성된 인스턴스별 식별자입니다(System-Generated 값 사용(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 런타임에서 자동으로 생성되는 기본별 식별자입니다(System-Generated 값 사용(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 런타임에서 자동으로 생성된 꼭짓점별 식별자입니다(System-Generated 값 사용(Direct3D 10)참조). 꼭짓점 셰이더에 대한 입력으로만 사용할 수 있습니다. uint
SV_ViewportArrayIndex Viewport 배열 인덱스입니다. 기하 도형 셰이더 출력에 적용되며 현재 작성 중인 기본 형식에 사용할 뷰포트를 나타냅니다. 픽셀 셰이더에서 읽을 수 있습니다. 기본 형식은 래스터라이저에 전달되기 전에 인덱스로 지정된 뷰포트에 대해 변환되고 잘립니다. 이 의미 체계는 기본 형식에만 적용됩니다. 기본 형식에 둘 이상의 꼭짓점이 있으면 선행 꼭짓점의 값이 사용됩니다.
D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizertrue경우 래스터라이저를 공급하는 셰이더에 SV_ViewportArrayIndex 적용됩니다.
uint
SV_ShadingRate 음영 속도값을 통해 가변 음영 속도 계층 2 이상의 디바이스에 대해 1픽셀 셰이더 호출로 작성된 픽셀 수를 정의합니다. 픽셀 셰이더에서 읽을 수 있습니다. 꼭짓점 또는 기하 도형 셰이더에서 작성할 수 있습니다. uint

 

 

 

 

 

vertex shader output의 설명에 보면 POSITION에 다렉10 이상부터는 SV_POSITION을 사용한다고 나와있습니다. 

 

그러니까 정리하자면.. 그냥 POSITION은 버텍스셰이더의 인풋으로 사용되며 말그대로 버텍스의 포지션을 의미하고 SV_POSITION은 투영공간으로 변환된 후의 버텍스 포지션을 의미합니다. 

 

 

데이터타입은 똑같은데 섞어서 쓰면 오류나나?

 

-> 딱히 오류는 안 났습니다. 설명대로 가능한 부분과 아닌 부분이 있는 것 같습니다. 

딱 정말 의미를 구분하기위해 사용하는 건가.....

(수정)-> 아니다 오류남, 버텍스셰이더 아웃풋은 POSITION 사용불가

 

참고:

https://jangsung1.tistory.com/9

 

[URP Shader Training]1. 4_픽셀 셰이더 출력 값 확인(NDC는 언제?)

강의 보다 궁금한 부분 생겨서 잠깐 실험... 인데 모르겠다Pixel shader 출력시 색 확인왜 이런 결과가 나오는가? => screen 공간상의 좌표라서의문 1. NDC 변환은 언제 수행되는가?/output의 결과는 clip인

jangsung1.tistory.com