6.3 정점 셰이더(Vertex Shader)
셰이더는 HLSL라는 언어로 작성한다.
https://dandydot.tistory.com/category/HLSL
'HLSL' 카테고리의 글 목록
dandydot.tistory.com
본질적으로 정점 셰이더는 하나의 함수이다. 아래 예제를 보면 정점 셰이더(VS)의 첫째, 둘째는 입력(in) 매개변수고, 나머지 두개는 출력(out) 매개변수다. HLSL는 참조나 포인터가 없으므로 이렇게 in(생략가능), out이 지정된 매개변수를 사용해야 한다. HLSL에서 함수는 항상 인라인화 된다.
cbuffer cbPerObject : register(b0)
{
float4x4 gWorldViewProj;
};
void VS(float3 iPosL : Position,
float4 iColor : Color,
out float4 oPosH : SV_Position,
out float4 oColor : Color)
{
oPosH = mul(float4(iPosL, 1.0f), gWorldViewProj);
oColor = iColor;
}
처음 두 입력 매개변수(iPosL, iColor)는 정점 셰이더의 입력 서명(input signature)을 형성한다. 매개변수 시맨틱(대소문자 구분X) ": Position"과 ": Color"은 정점 구조체의 멤버들을 정점 셰이더 입력 매개변수들에 대응시키는 역할을 한다. 출력 매개변수 시맨틱(SV_Position, Color)은 셰이더의 출력을 파이프라인의 다음 단계(GS or PS)의 입력에 대응시키는 역할을 한다.
GPU는 절단, 깊이 판저으 래스터화 등 다른 특성들에는 적용하지 않는 특별한 연산들을 위치에 적용하므로, 이처럼 SV_Position 의미소를 지정해 GPU에게 이것이 위치를 담은 출력 성분임을 알려주어야 한다.
what is the difference between "float4 pos:SV_POSITION"and "float4 pos;"
why do we need sv_position?
forum.unity.com
예제 코드 첫 줄은 정점 위치에 4x4 행렬 gWorldViewProj를 곱해 정점을 국소 공간에서 동차 절단 공간으로 변환한다. 셰이더의 마지막 줄은 입력 색상을 그대로 출력 매개변수에 복사한다. 이에 의해 그 색상이 파이프라인의 다음 단계로 공급된다.