본문 바로가기

개발/DirectX3D

DirectX Shader LUT 필터 코드 구현

안녕하세요 넬다이입니다.

오늘은 LUT에 대해서 배워보도록 할 생각인데요

 

LUT는 무엇인가?

아마 잘 모르시는 분들도 계실 거예요. 저도 처음에 이게 뭔가 싶었거든요.

기존에는 영상 쪽이나 포토샵 쪽에서 사용하던 기법으로 분위기를 변경하거나 할 때 사용을 한 것 같으며 후처리 필터로써 상대적으로 낮은 비용으로 최고의 효과를 얻을 수 있다고 생각을 하는 기법입니다.

 

자 일단 직접 보시면 편하실 거예요

지금 보시는 화면은 다른 LUT를 이용해서 필터를 적용시킨 모습입니다.

 

분명 하나의 씬이지만 LUT의 따라서 분위기가 전혀 다르게 바뀌는데요 LUT텍스처는 이런 형태로 되어있어요

저도 이 당시에 저런 텍스처를 처음 봤기 때문에 여러분들도 처음 보셨을 수도 있고 이미 알고 계신 분들도 있을 거예요

하지만 지금 중요한 건 LUT를 어떻게 구현하냐겠죠? 일단 저 파일들은 제가 글 하단에 올려서 첨부해드리겠습니다.

 

자 일단 코드를 확인해볼 텐데요 전체 코드입니다

texture g_HDRTex;
sampler g_HDRSam = sampler_state
{
	texture = g_HDRTex;
};

texture g_LUTTex;
sampler2D g_LUTSam = sampler_state
{
    texture = g_LUTTex;
};

float3 GetLutColor(float3 colorIN, sampler2D LutSampler)
{
    float2 LutSize = float2(0.00390625, 0.0625); // 1 / float2(256, 16);
    float4 LutUV;
    colorIN = saturate(colorIN) * 15.0;
    LutUV.w = floor(colorIN.b);
    LutUV.xy = (colorIN.rg + 0.5) * LutSize;
    LutUV.x += LutUV.w * LutSize.y;
    LutUV.z = LutUV.x + LutSize.y;
    return lerp(tex2Dlod(LutSampler, LutUV.xyzz).rgb, tex2Dlod(LutSampler, LutUV.zyzz).rgb, colorIN.b - LutUV.w);
}

struct tagPS_OUT
{
    float4 LUT : COLOR;
};


tagPS_OUT PS_MAIN(float2 texCoord : TEXCOORD0)
{  
    tagPS_OUT Out = (tagPS_OUT) 0;

	Out.LUT = tex2D(g_HDRSam , texCoord);

	Out.LUT = float4(GetLutColor(Out.LUT.rgb, g_LUTSam), 1.f);
	}

    return Out;
}  

technique DefaultTech
{
	pass Pass0
	{
		ZWriteEnable = false;
		lighting = false;
		vertexshader = NULL;
		pixelshader = compile ps_3_0 PS_MAIN();

	}
}

보시면 아시겠지만 핵심은 GetLutColor입니다.

GetLutColor은 실제 Color를 기준으로 LUT Texture 위치에 간 뒤 그 색상표를 필터로써 적용시키는 작업입니다.

 

GetLutColor 말고는 다른 부분은 별로 신경 안 쓰셔도 될 정도로 LUT가 하는 일이 명환 한데요 그 명확함은 LUT텍스처에 Color값으로 위치를 찾고 그 안에 값으로 필터를 적용한다. 정도로 끝낼 수 있습니다.

 

오늘은 LUT에 대해서 알아봤는데요 저는 LUT를 처음 알게 된 당시에도 이게 뭐 하는 건지도 잘 모른 상태로 어찌어찌 개발을 했는데요 그 후에서야 정확하게 LUT는 무엇이 다라를 알게 되었습니다. 그전에는 LUT 기법도 몰랐도 찾아보니 영상이나 포토샵에서 사용하는 기법이라고만 나와있지 이걸 개발에 사용해봐야겠지도 바로 생각해내지 못했거든요.

 

여러분들은 이렇게 찾아 들오셨다는 건 LUT가 필요해서라고 생각이 들고 이 글을 보고 손쉽게 개발을 완료할 수 있었으면 하네요 ㅎㅎㅎ 이만 넬다이 물러가겠습니다.

 

LUT.zip
0.63MB

 

[개발/DirectX3D] - DirectX Shader Bloom 코드 구현

[개발/DirectX3D] - DirectX Blur Shader 코드 구현

[개발/DirectX3D] - DirectX SSAO(Screen Space Ambient Occlusion) Shader 코드 구현