응애맘마조

230817 강의 본문

공부/3D강의

230817 강의

TH.Wert 2023. 8. 17. 20:56

어제에 이어 포스트 이펙트를 했습니다.

#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);
}

일정 부분만을 보이고 나머지 부분을 점점 어둡게 처리하는 방법입니다. 공포게임에 많이 활용됩니다.

이외에도 많은 효과를 구현할 수 있습니다.

 

내일은 로딩씬을 한다고 했고 조명을 키웠다 줄였다 하는 방식으로 한다고 했습니다.

읽어주셔서 감사합니다.

'공부 > 3D강의' 카테고리의 다른 글

230822 강의  (0) 2023.08.22
230818 강의  (0) 2023.08.21
230816 강의  (0) 2023.08.16
230814 강의  (0) 2023.08.14
230807 강의  (0) 2023.08.07