WinCNT

Illusion 본문

게임 프로그래밍(학습 내용 정리)/게임 수학

Illusion

WinCNT_SSS 2022. 6. 28. 14:51

아지랑이(Haze)처럼 빛이 굴절되는 현상을 표현하는 기법

캐릭터의 사망 연출 등에도 자주 사용된다

Illusion의 구현 원리

Illusion Code

sampler2D TextureSampler;
sampler2D Noise;
float fStrength = 0.1;	// 노이즈의 강도
float fTime0_X;
float2 uvDir = float2( 1, 1 );	// 노이즈 맵을 읽을 방향

float4 ps_main( float2 uv : TEXCOORD0 ) : COLOR
{
   float4 c0;
   float2 st = uv + uvDir * fTime0_X;	// 시간에 따라서 노이즈 맵의 읽을 방향을 이동시킨다
   float2 offset = tex2D( Noise, st ).xy * 2 - 1;
   float2 uv2 = uv + offset.xy * fStrength;
   c0 = tex2D( TextureSampler, uv2 ).r;	// 흑백으로 전환
   
   // 원본 텍스처
   float4 c1 = tex2D( TextureSampler, uv );
   
   return c0;
   // return c0.r;	// 흑백으로 출력
   // return lerp(c0, c1, fAlpha);	// 원본과 노이즈 값을 알파값으로 보간하는 경우
}

텍스처 좌표 교란(Texture Perturbation)

개발자가 의도적으로 좌표를 어긋나게(교란)하는 기법

Post Processing은 아니지만 다양한 효과를 얻을 수 있다

이 기법을 활용하면 텍스처만으로 흐르는 물의 느낌을 줄 수 있다

sampler2D   diffuseMap;
sampler2D   bumpMap;
float      weight;
float      fTime0_X;
float      flowspeed;

struct PS_INPUT 
{
   float2 uv : TEXCOORD0;
};

float4 ps_main( PS_INPUT Input ) : COLOR0
{
   float2 uv = float2( Input.uv.x + fTime0_X * flowspeed, Input.uv.y );
   float2 n = tex2D(bumpMap, uv).xy;
   
   return tex2D(diffuseMap, Input.uv.xy + weight * n);
}

 

SSS

'게임 프로그래밍(학습 내용 정리) > 게임 수학' 카테고리의 다른 글

SSAO(Screen Space Ambient Occlusion)  (0) 2022.07.12
Texture Technique  (0) 2022.07.12
Edge Detect Filter  (0) 2022.06.28
Light Shaft  (0) 2022.06.28
Vignetting  (0) 2022.06.28