K-digital traning/3D 콘텐츠 제작

Placid Plastic Duck Simulator - 개발일지2

내꺼블로그 2023. 10. 5. 11:30

 

water shader를 구현하기에 앞서 기본적인 세팅부터 작업.

 

 

물을 구현하는 방법은 기본적으로 plane에다 shader를 적용하여 plane의 vertex를 조절하는 것에서 출발한다.

보다 사실적인 물 표현을 하려면 엣지가 무수히 많은 plane을 생성하고 시작해야겠지만 아직 blender를 다뤄보지 못한 관계로 유니티 내에 있는 일반적인 plane을 사용해보았다.

 

 

 

 

 

 

 

 

그 다음 plane에 입힐 material과 material을 표현해줄 shader를 생성한다.

 

물 밖에서 바라보는 물과 물 안에서 바라보는 물은 다른 양상을 띠므로 두 가지의 경우로 생성해보았다.

(실제로 waterBack까지는 구현할 수 있을지 미지수이다만,,,,)

 

 

 

 

 

 

먼저 색상과 specular를 구현해보았다. +투과

 

 

사진을 보고 매우 당황스럽고 의심되기도 하겠지만 놀랍게도 그렇다. 이다.

아직 wave를 구현하지 않아서 저렇게 매끄럽고 specular가 똥글뱅이 하나로밖에 안보이는거다.(라고 믿는중)

얘를 좀 더 물처럼 표현하려면 normal map을 적용하고 vertex를 움직이고 그 다음 위의 구현에 디테일을 추가해주면 된다.(내가 디테일을 구현할 수 있을지는 나도 의문이다만,,,)

일단 코드를 보면서 구현한 부분을 살펴보쟈,,

 

 

 

 

먼저 속성 부분이다. 물 표면 색상과 Specular 색상을 Inspector 창에서 조절할 수 있도록 하였다.

 

 

 

 

 

 

SubShader 부분이다.

변수로 _Color, _SpecCol을 설정하였다. 각각 물의 표면 색상, specular 색상이다.

추가로 투과도 설정해주기 위해 grabpass를 사용하였다.

 

 

 

 

 

 

물 표면에 색상을 입히고 투과도 표현해보았다.

grabtexture를 입힐 때 스크린의 depth에 영향을 받지 않도록 하기 위해 scrPos의 xyz값을 w(depth)로 나누어주었다.

또 물의 투과를 표현할 때 화면을 바라보는 방향과 shader의 normal이 서로 마주보는 방향일수록 투과가 더 잘일어나는 모습을 보이기 위해 두 벡터를 내적하였고, 그 값으로 grab과 물 표면을 lerp로 섞었다.

 

 

 

 

 

light를 custom으로 설정하여 임의로 specular를 설정하였다.

 

 

 

 

 

 

투과 참고

https://darkcatgame.tistory.com/30

 

Unity Shader - Water

물을 표현하기 위해서는 많은 현상들을 구현해야 하지만 그중에서 구체적으로 몇 가지만 구현을 하여 표현이 가능합니다. 이번 포스팅에서는 Reflection(반사), Wave(파도), Fresnel(빛투과), Distortion(

darkcatgame.tistory.com