응애맘마조
230817 강의 본문
어제에 이어 포스트 이펙트를 했습니다.
#include "Common.hlsl"
struct VertexInput
{
float4 Position : POSITION0;
float2 Uv : UV0;
};
struct PixelInput
{
float4 Position : SV_POSITION;
float2 Uv : UV0;
};
PixelInput VS(VertexInput input)
{
PixelInput output;
output.Uv = input.Uv;
// o = i X W
output.Position = mul(input.Position, World);
return output;
}
float4 PS(PixelInput input) : SV_TARGET
{
return BaseColor;
}
포스트 이펙트의 hlsl 파일입니다. PS 안에서 여러 가지 효과를 구현할 수 있습니다.
input.Uv *= 30.0f;
input.Uv.r = floor(input.Uv.r);
input.Uv.g = floor(input.Uv.g);
input.Uv /= 30.0f;
float4 BaseColor = TextureD.Sample(SamplerD, input.Uv);
모자이크 처리입니다. 숫자를 키울수록 모자이크 크기가 줄어들어 선명하게 나옵니다.
BaseColor.g = 0;
BaseColor.b = 0;
빨간색만 표현하는 필터입니다. 한 가지 색만 표현하고 싶으면 그 색을 제외하고 나머지를 전부 0으로 하면 됩니다.
float3 temp = (BaseColor.r + BaseColor.g + BaseColor.b) / 3.0f;
BaseColor.r = dot(temp.rgb, float3(0.393f, 0.769f, 0.189f));
BaseColor.g = dot(temp.rgb, float3(0.349f, 0.686f, 0.168f));
BaseColor.b = dot(temp.rgb, float3(0.272f, 0.534f, 0.131f));
세피아 효과입니다. 어떤 상수값으로 계산하면 나오는지는 모르겠지만 값은 이렇습니다.
BaseColor.rgb *= 4.0f;
BaseColor.r = floor(BaseColor.r);
BaseColor.g = floor(BaseColor.g);
BaseColor.b = floor(BaseColor.b);
BaseColor.rgb /= 4.0f;
RGB의 값을 4로 곱해서 버림을 하고 4로 나누었을 때입니다. 표현되는 색깔이 제한적이고 비슷한 색깔끼리는 전부 같은 색으로 나타납니다.
BaseColor.rgb = (1.0f - BaseColor.rgb);
1에서 RGB를 뺀 값입니다. 색상 반전입니다.
float2 Point = float2(400, 300);
float dis = length(input.Position.xy - Point);
dis = 1.0f - saturate(dis / 600);
BaseColor.rgb *= dis;
if (dis > 300)
{
return float4(0, 0, 0, 0);
}
일정 부분만을 보이고 나머지 부분을 점점 어둡게 처리하는 방법입니다. 공포게임에 많이 활용됩니다.
이외에도 많은 효과를 구현할 수 있습니다.
내일은 로딩씬을 한다고 했고 조명을 키웠다 줄였다 하는 방식으로 한다고 했습니다.
읽어주셔서 감사합니다.