멜트 기본형 만들기 - 엠플리파이트 셰이더 안에 있는 예제 분석 공부입니다 



일단 버텍스 셰이더에서 


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




그러면 이렇게 됨



  1. 당연하지만 적절한 노이즈 텍스쳐는 넣어 놨어야죠 [본문으로]