Shader "Custom/Water"
{
Properties
{
_BumpMap ("_BumpMap)", 2D) = "bump" {}
_Cube("Cube", Cube) = ""{}
_Color("spec Color", color) = (1, 1, 1, 1)
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue"="Transparent"}
CGPROGRAM
#pragma surface surf WaterSpecular alpha:fade vertex:vert
#pragma target 3.0
sampler2D _BumpMap;
samplerCUBE _Cube;
float4 _Color;
void vert(inout appdata_full v)
{
float movement;
float length = 5;
float height = 0.5;
float time = 3;
movement = sin(abs((v.texcoord.x * 2 - 1) * length) + _Time.y * time) * height;
movement += sin(abs((v.texcoord.x * 2 - 1) * length) + _Time.y * time) * height;
v.vertex.y += movement / 2;
}
struct Input
{
float2 uv_BumpMap;
float3 worldRefl;
float3 viewDir;
INTERNAL_DATA
};
void surf (Input IN, inout SurfaceOutput o)
{
float3 normal1 = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap + _Time.x * 0.1));
float3 normal2 = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap - _Time.x * 0.1));
o.Normal = (normal1 + normal2) / 2;
float3 refColor = texCUBE(_Cube, WorldReflectionVector(IN, o.Normal));
float rim = saturate(dot(o.Normal, IN.viewDir));
rim = pow(1 - rim, 1.5);
o.Emission = refColor * rim;
o.Alpha = saturate(rim + 0.5);
}
float4 LightingWaterSpecular(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten)
{
float3 h = normalize(lightDir + viewDir);
float spec = saturate(dot(h, s.Normal));
spec = pow(spec, 300);
float4 final;
final.rgb = spec * _Color.rgb * 5;
final.a = s.Alpha + spec;
return final;
}
ENDCG
}
FallBack "Diffuse"
}
노멀맵의 uv값에 _Time을 곱하여 물이 흐르는 듯한 효과를 주었으며, Sky에 적용된 것과 같은 큐브맵 텍스쳐를 Water Material에 적용하여 마치 빛이 반사된 것 같은 효과를 준다.
'Unity3D > Shader' 카테고리의 다른 글
Shader) HLSL 아래로 흐르는 셰이더 구현 (0) | 2023.09.22 |
---|---|
Shader) Unity URP 기반 HLSL셰이더 기본형 (0) | 2023.09.22 |
Unity) [Shader] 2Pass 알파블랜딩으로 Dissolve, 투명 효과 구현 (0) | 2023.03.22 |
Unity) [Shader] Diffuse Warping 기법 (0) | 2023.03.22 |
Unity) [Shader] 2Pass 아웃라인과 프레넬을 활용한 아웃라인 (0) | 2023.03.22 |