상세 컨텐츠

본문 제목

[DirectX11] Graphics Pipeline 4 - Pixel Shader

DirectX 11

by 이나시오- 2024. 8. 27. 17:10

본문

Pixel Shader

 Pixel Shader는 Rasterizer에서 계산한 픽셀들에 대해 어떤 색으로 출력할 지 결정하는 단계이다. 우리는 Vertex에 Color 정보를 넣어뒀고, Rasterizer 단계에서 그 값들이 선형 보간되어서 픽셀마다 값이 계산되어 있으므로 그대로 색을 사용해도 되고, 텍스쳐를 사용하는 경우 Sampler을 사용해서 이미지의 픽셀값을 적절히 가져와서 할당할 수도 있다. 이에 대한 내용은 다른 포스트에서 작성해보겠다.

 

 Pixel Shader도 Vertex Shader 같이 .fx 셰이더 코드로 작성하고, D3DCompileFromFile을 통해 Blob 구조체에 binary 코드를 저장하고, CreatePixelShader()로 셰이더를 생성하게 된다. 코드로 그 과정을 알아보자.

// Shader.fx
struct VS_IN
{
    float3 Pos : POSITION;
    float4 Color : COLOR;
    float2 UV : TEXCOORD;
};

struct VS_OUT
{
    float4 Pos : SV_Position;
    float4 Color : COLOR;
    float2 UV : TEXCOORD;
};

float4 PS_Shader (VS_OUT _in) : SV_Target
{
    return _in.Color;
}

 

 Pixel Shader의 경우 SV_Target semantic을 붙이는데, 이는 리턴 값이 SV_Target에 해당하는 값이라는 것을 의미한다. 리턴 타입이 float4인 것은 Color 값을 RGBA로 받기 때문이다. 이 코드에서는 Rasterizer에서 보간된 컬러값을 그대로 사용하도록 설정했다.

 

// m_PSBlob : Pixel Shader Blob, ComPtr<ID3D11Blob>
D3DCompileFromFile(L"D:\\Shader.fx", nullptr, D3D_COMPILE_STANDARD_FILE_INCLUDE
	, L"PS_Shader", "ps_5_0", D3DCOMPILE_DEBUG, 0, m_PSBlob.GetAddressOf(), m_ErrBlob.GetAddressOf());

// m_PS : Pixel Shader, ComPtr<ID3D11PixelShader>
DEVICE->CreatePixelShader(m_PSBlob->GetBufferPointer(), m_PSBlob->GetBufferSize(), nullptr, m_PS.GetAddressOf());

// Pipeline에 바인딩
CONTEXT->PSSetShader(m_PS.Get(), nullptr, 0);

 

 

관련글 더보기