픽셀 셰이더는 입력으로부터 한 픽셀의 색상을 계산하는 것이다. 정점 셰이더와 마찬가지로 본질적으로는 하나의 함수이다. 중요한 차이점은 정점 셰이더는 정점 마다 실행되는 것이 아니라 모든 픽셀 하나씩 실행된다는 점이다. 즉, 1024×720 해상도라면 픽셀 셰이더는 737,280번 실행된다는 뜻이다.
아래의 그림은 셰이더상 정점 셰이더가 공급한 정점 자료가 픽셀 셰이더에 도달하기까지의 경로를 나타낸 것이다.

정점 셰이더 VS의 매개변수에서 out 키워드가 붙은 출력 매개변수들이 픽셀 셰이더 PS로 대응된다는 것만 알면 된다.
그런데 픽셀 단편(*주 1)이 도중에 기각되어서 후면 버퍼까지 도달하지 못하여 렌더링되지 않을 수 있다. 예를 들어 깊이 값이 더 작은 다른 픽셀에 가려질 수 있고, 시야각 밖의 정점이여서 절단(clipping) 될 수도 있다.
아래의 코드는 정점 셰이더에서 픽셀 셰이더까지의 코드이다.
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; //정점의 색을 그대로 픽셀 셰이더로 전달
}
float4 PS(float4 posH : SV_POSITION, float4 color : COLOR) : SV_Target
{
return color; //정점 셰이더에서 받은 색상을 그대로 출력
}
픽셀 셰이더 PS의 입력 매개변수가 정점 셰이더 VS의 출력 변수와 정확히 일치하다는 것이 필수조건이다. 또한 : SV_Target이라는 시맨틱은 이 함수의 반환값 형식이 렌더 대상 형식과 일치해야 함을 뜻한다.
아래의 코드는 입력, 매개변수를 사용하지 않고, 반환 형식과 입력 구조체를 사용한 방식이다. 위 코드와 정확히 같은 일을 한다.
struct 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;
}
float4 PS(VertexOut output) : SV_Target
{
return output.Color; //정점 셰이더에서 받은 색상을 그대로 출력
}
(*주 1)픽셀 단편
정점이 들어왔다고 해서 무조건 렌더링 되는 것이 아니다. 후면 버퍼까지 도달하여 렌더링 될 픽셀이 있으면, 여러 이유로 렌더링 되지 못 할 픽셀들이 존재하는데, 렌더링 될 가능성이 있는 픽셀들을 픽셀 단편이라고 한다.
'서적 정리 > DirectX11을 이용한 3D 게임 프로그래밍 입문' 카테고리의 다른 글
52.언덕 예제 (0) | 2022.02.15 |
---|---|
51.상자 예제 (0) | 2022.02.15 |
50.효과 프레임워크(Effect Framework) (0) | 2022.02.10 |
49.렌더 상태(Render State) (0) | 2022.02.09 |
47.상수 버퍼(Constant Buffer) (0) | 2022.02.08 |
46.예제 정점 셰이더 (0) | 2022.02.08 |
45.인덱스와 인덱스 버퍼(Index Buffer) (0) | 2022.02.08 |
44.정점 버퍼(Vertex Buffer) (0) | 2022.02.07 |
댓글