[DX11] Post-Processing ( 회색 화면 출력 )
Post Processing (후처리)
모든 렌더링이 다 끝나고 난 뒤 처리되는 작업 ( 마무리 작업 )
Post Process 텍스처
위에서 말했듯이 후처리는 현재 렌더 타겟에 모든 렌더링이 끝나고, 마무리 작업으로 효과를 주거나 하는 작업이므로, 렌더 타겟을 후처리 텍스처에 복사 받아야 한다.
텍스처 생성
void CAssetMgr::CreateEngineTexture()
{
// PostProcess 용도 텍스쳐 생성
Vec2 Resolution = CDevice::GetInst()->GetResolution();
Ptr<CTexture> pPostProcessTex = CreateTexture( L"PostProcessTex"
, (UINT)Resolution.x, (UINT)Resolution.y
, DXGI_FORMAT_R8G8B8A8_UNORM, D3D11_BIND_SHADER_RESOURCE);
}
DXGI_FORMAT 은 렌더타겟과 같이 색상정보를 등록할 것이기 때문에 R8G8B8A8 포멧으로 적용하고,
BIND_FLAG는 SHADER_RESOURCE FLAG를 사용하여 텍스처 레지스터에 전달시켜 샘플링 용도로 사용할 것이다. 렌더링 대상인 렌더 타겟으로 설정하는 것이 아니기 때문에 RENDER_TARGET FLAG와 조합하지 않는다.
렌더타겟 복사
void CRenderMgr::PostProcessCopy()
{
// RenderTarget -> PostProcessTex
Ptr<CTexture> pRTTex = CAssetMgr::GetInst()->FindAsset<CTexture>(L"RenderTargetTex");
CONTEXT->CopyResource(m_PostProcessTex->GetTex2D().Get(), pRTTex->GetTex2D().Get());
}
렌더링이 끝난 후 렌더타겟에 있는 내용을 그대로 복사받기 위해 렌더타겟을 받아와 ID3D11DeviceContext::CopyResource 메서드를 이용한다. GPU를 사용하여 원본 리소스의 전체 내용을 대상 리소스에 복사하는 함수이다. 이 떄 두 리소스의 크기와 타입이 같아야 한다.
Post Processing 예제 ( 회색 화면 출력 )
// ================
// GrayFilterShader
// ================
struct VS_IN
{
float3 vPos : POSITION;
float2 vUV : TEXCOORD;
};
struct VS_OUT
{
float4 vPosition : SV_Position;
float2 vUV : TEXCOORD;
};
VS_OUT VS_GrayFilter(VS_IN _in)
{
VS_OUT output = (VS_OUT) 0.f;
output.vPosition = float4(_in.vPos.xy * 2.f, 0.f, 1.f);
output.vUV = _in.vUV;
return output;
}
float4 PS_GrayFilter(VS_OUT _in) : SV_Target
{
float4 vColor = g_tex_0.Sample(g_sam_0, _in.vUV);
float Average = (vColor.x + vColor.y + vColor.z) / 3.f;
vColor = float4(Average, Average, Average, 1.f);
return vColor;
}
회색 화면 Post Process 효과 Shader 코드를 작성해 보았다.
PostProcess 는 RectMesh에 복사받은 화면을 출력하는데 이 떄 기본적으로 생성되는 RectMesh의 크기는 가로세로 길이가 1이다(로컬 공간 기준). NDC 좌표계는 가로세로가 2인 정사각형 이므로 화면에 가득 채우려면 RectMesh의 가로 세로 길이를 2배로 늘려주어야 한다.
Vertex Shader에서는 Position xy 값에 2배를 곱해주고, 이 상태로 Pixel Shader에 넘겨준다. 이렇게
Pixel Shader에서는 렌더 타겟을 복사한 텍스처 g_tex_0 을 샘플링 하여 회색 처리를 해주고 출력한다.