Skip to content

yopy-dev/Unity-Shield-Effect-Shader

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 

Repository files navigation

Unity-Shield-Effect-Shader

프로젝트 Horizon에서 일정 영역에 시간이 멈추는 효과를 구현하였습니다.

참고 이펙트

인터넷을 돌아다니다가 원하던 형태의 이펙트를 발견하여 참고하였습니다.

UDK_Shield_Effect
[출처]: https://youtu.be/VozAvdeY8eA

이펙트 구현

위의 동영상에는 따로 코드가 없어 이미지를 보고 추측하여 구현하였습니다. 구현에는 아래 4가지 요소를 포함하고 싶었습니다.

  1. 구형 바깥 부분이 빛날 것
  2. 충돌 위치로부터 distortion층이 퍼져 나갈 것
  3. distortion층은 중앙이 가장 distortion되고 끝 부분으로 갈수록 줄어들 것
  4. 충돌 위치로부터 퍼질수록 distortion이 작아지며 일정 거리를 넘어가면 사라질 것
TimeStopEffect
구현한 이펙트

구현 방법

1) 구형 바깥 부분이 빛날 것

림 쉐이더로 구현하였습니다.

2,3,4) 공통

아래 3가지 사항은 픽셀 쉐이더에서 각각의 픽셀 값을 정할 때 distortion scale을 얼마나 줄 것인지에 대한 함수를 제작하여 구현하였습니다.

// pos : 픽셀 위치, hitPoint : (x,y,z=충돌 위치, w=distortion범위 확산 거리)
float GetDistortionScale(float3 pos, float4 hitPoint)

2) 충돌 위치로부터 distortion층이 퍼져 나갈 것

3) distortion층은 중앙이 가장 강하고 끝 부분으로 갈수록 줄어들 것

distortion영역의 범위를 넘어서면 0으로 만들고 영역 내부에서는 끝 부분으로 갈수록 값이 줄어들도록 함수를 설계하였 습니다.

float distortion = 0.0f;
// 해당 픽셀과 초기 충돌 위치와의 거리
float dis = distance(hitPoint.xyz, pos);
// distortion되는 영역의 크기                            
float hitSize = 2.0f;
// 해당 픽셀이 영역에 들어왔는지 확인하고 중앙에서부터 멀어 질수록 희미하게만든다.
distortion = (hitPoint.w - dis) / (hitSize / 2.0f);
distortion = max(0.0f, -(distortion*distortion) + 1.0f);
distortion확산
x축 : 현재 distortion확산 중심으로부터의 normalize된 거리, y축 : distortion scale

4) 충돌 위치로부터 퍼질수록 distortion이 작아지며 일정 거리를 넘어가면 사라질 것

충돌점부터 distortion이 줄어들어 구 영역으 반대편이되면 보이지 않게 함수를 설계하였습니다.

// 충돌위치의 구의 일정 위치를 넘어가면 보이지 않게 한다.
float maxDistance = 6.0f;
distortion *= max(0.0f, (-dis*dis/maxDistance*maxDistance + 1.0f));
distortion확산2
x축 : 충돌 지점부터 픽셀까지의 거리, y축 : distortion scale

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors