셰이더는 HLSL(High Level Shading language) 언어로 작성한다. Direct3D에서 셰이더 프로그램은 주로 이펙트 파일(effect file, .fx)이라고 부르는 텍스트기반 파일로 작성한다.
정점 셰이더는 본질적으로 하나의 함수이다.
cbuffer cbPerObject
{
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; //정점의 색을 그대로 픽셀 셰이더로 전달
}
위 코드에서 VS라는 이름의 함수가 정점 셰이더인데, 반드시 VS라는 이름을 사용해야 하는 것은 아니다. 함수의 매개변수가 네 개인데, 처음 둘은 입력 매개변수이고, 나머지 둘은 출력 매개변수이다. HLSL에는 참조나 포인터가 없으므로, 함수가 여러 개의 값들을 돌려주려면 out이 지정된 출력 매개변수를 사용해야 한다.
함수의 매개변수를 보면 시맨틱(semantic)이 부여되어 있다(: POSITION, : COLOR 등). 입력 매개변수의 시맨틱은 Direct3D의 정점 구조체의 멤버들을 정점 셰이더 입력 매개변수들에 대응시키는 역할을 한다.

출력 매개변수에도 시맨틱이 부여되어 있다. 이들은 정점 셰이더의 출력을 다음 단계의 파이프라인에 해당 입력에 대응시키는 역할을 한다. 특히 SV_POSITION의 경우 SV는 system value(시스템 값)을 의미한다. 즉 SV_POSITON은 정점 셰이더의 SV_POSITIONT에 해당하는 oPosH는 정점의 위치를 담고 있음을 말해 준다.
다음 셰이더 코드는 위의 셰이더 코드와 정확히 같은 일을 하지만, 반환 형식과 입력 구조체들을 사용하는 방식이다. 쉽게 설명해서 매개변수로 다음 파이프라인으로 보낼 출력 매개변수를 설정했다면, 이 방식은 출력 매개변수를 함수의 반환 값으로써 구조체로 만든다는 것이다. 내가 주로 사용하는 방식이고, 입력, 출력 매개변수를 따로 구조체로 구분지어 만듬으로써 알아보기 쉽다.
cbuffer cbPerObject
{
float4x4 gWorldViewProj;
};
struct VertexIn
{
float3 PosL : POSITION;
float4 Color : COLOR:
};
struct VertexOut
{
float4 PosH : SV_POSITION;
float4 Color : COLOR;
};
VertexOut VS(VertexIn vertex)
{
VertexOut output;
output.PosH = mul(float4(vertex.PosL, 1.0f), gWorldViewProj); //동차 절단 공간으로 변환
output.Color = vertex.Color; //정점 색상을 그대로 픽셀 셰이더로 전달
return output;
}
'서적 정리 > DirectX11을 이용한 3D 게임 프로그래밍 입문' 카테고리의 다른 글
50.효과 프레임워크(Effect Framework) (0) | 2022.02.10 |
---|---|
49.렌더 상태(Render State) (0) | 2022.02.09 |
48.예제 픽셀 셰이더 (0) | 2022.02.08 |
47.상수 버퍼(Constant Buffer) (0) | 2022.02.08 |
45.인덱스와 인덱스 버퍼(Index Buffer) (0) | 2022.02.08 |
44.정점 버퍼(Vertex Buffer) (0) | 2022.02.07 |
43.정점과 입력 배치 (0) | 2022.01.25 |
42.렌더링 파이프라인 요약 (0) | 2022.01.25 |
댓글