멜트 기본형 만들기 - 엠플리파이트 셰이더 안에 있는 예제 분석 공부입니다
일단 버텍스 셰이더에서
float meltHeight = _Height - vertexPos.y;
을 추가해서
v.vertex.xyz += float3(0, meltHeight, 0);
을 만듭니다.
이렇게 되면 _Height 값을 조절하면 , 버텍스 포지션 을 뺀 것에 다시 버텍스 포지션을 더했으니 버텍스 포지션은 0가 되고,
모든 버텍스가 _Height 값의 y 값으로 이동하게 됩니다
그 상태에서 여기서
float meltHeight = min(0,_Height - vertexPos.y);
으로 만들어서, 0보다 아래 값만 존재하게 합니다. 즉 + 값은 없는거임
v.vertex.xyz += float3(0, meltHeight, 0);
그래서 이걸 다시 이렇게 넣으면
_Height 값이 원래의 vertex y 값보다 낮으면, 즉 _Height 값보다 위에 있는 버텍스들은 결과적으로 음수가 되고,
그러면 원래 납작한 것 처럼, _Height 값으로 이동하게 됩니다.
그렇지만 _Height 값이 vertex.y 보다 높으면 양수가 되고, 이러면 버텍스가 올라갔던 것이 0가 되면서 안 올라가게 되고 제자리에 있게되니까 이렇게 되죠
짜잔
자 이제 저 편평한 윗판을 좀 구기기 위해서 텍스쳐를 사용합시다.
옛날엔 버텍스 셰이더에서 텍스쳐를 못썼지만 그건 진짜 고릿적때 얘기고.. 지금은 다 쓰죠
하여간 씁시다
//노이즈 텍스쳐
float4 noiseTex = tex2Dlod(_NoiseTex, float4(float2(vertexPos.x, vertexPos.z)*0.1, 0, 0));
버텍스 셰이더에서 텍스쳐를 쓰려면 tex2Dlod 함수를 써야 합니다. 1
tex2dlod (sampler, float4(UV, 0,miplevel))
tex2Dlod 는 밉맵의 레벨을 불러온다. 일부러 텍스쳐를 흐리게 할 때 유용함.
단 이걸 사용하면 거리에 따른 밉맵 조절이 안되는 문제가 있다.
miplevel은 0 부터 사용한다. 숫자가 늘어날수록 밉 레벨이 늘어난다.
여기서의 miplevel은 2.5라고 넣는다면 2와 3 사이를 보간해 준다
#pragma target 3.0 필요
http://kblog.popekim.com/2011/04/tex2dlod.html
출처: http://chulin28ho.tistory.com/256?category=458928 [대충 살아가는 게임개발자]
그 후에
float noiseTexHeight= noiseTex.g + _Height;
로 _Height를 구겨주면
기존의 _Height를 대체하기 좋겠죠
그리고 출력하면
float meltHeight = min(0, noiseTexHeight - vertexPos.y);
v.vertex.xyz += float3(0, meltHeight, 0);
츠큐웅
지금까지의 코드는 다음과 같습니다.
_Height에 따라 올라갔다 내려갔다 한다는. 노이즈 좌표 스케일은 적당히 0.1 을 곱해줬습니다.
float3 vertexPos = v.vertex.xyz;
//노이즈 텍스쳐
float4 noiseTex = tex2Dlod(_NoiseTex, float4(float2(vertexPos.x, vertexPos.z)*0.1, 0, 0));
float noiseTexHeight= noiseTex.g + _Height;
float meltHeight = min(0, noiseTexHeight - vertexPos.y);
v.vertex.xyz += float3(0, meltHeight, 0);
거기다가 꼼수로 UV에서 U에 해상하는 vertexPos.x 에 _Height를 더해줘서 녹아내려갈때 흔들거리게 해줍니다.
float3 vertexPos = v.vertex.xyz;
//노이즈 텍스쳐
float4 noiseTex = tex2Dlod(_NoiseTex, float4(float2(vertexPos.x + _Height, vertexPos.z)*0.1, 0, 0));
float noiseTexHeight= noiseTex.g + _Height;
float meltHeight = min(0, noiseTexHeight - vertexPos.y);
v.vertex.xyz += float3(0, meltHeight, 0);
그러면 이렇게 됨
- 당연하지만 적절한 노이즈 텍스쳐는 넣어 놨어야죠 [본문으로]
'Shader ' 카테고리의 다른 글
고양이 입체 영상을 만들자! Parallax shader (0) | 2019.01.22 |
---|---|
melting shader (0) | 2019.01.21 |
SSS Shader for Unity (2) | 2019.01.19 |
텍스쳐 회전시키기 (0) | 2019.01.11 |
Unity 2018 built-in particle shaders 유니티 2018 내장 파티클 쉐이더_4 (0) | 2018.09.24 |
댓글