166 lines
5.9 KiB
HLSL
166 lines
5.9 KiB
HLSL
![]() |
#ifndef TOONSKETCH_WATERFORWARD_INCLUDED
|
|||
|
#define TOONSKETCH_WATERFORWARD_INCLUDED
|
|||
|
|
|||
|
#include "../../Shared/Shaders/TS_Forward.cginc"
|
|||
|
|
|||
|
#include "TS_WaterMain.cginc"
|
|||
|
#include "TS_WaterLighting.cginc"
|
|||
|
|
|||
|
TS_WaterVertexOutputForwardBase TS_VertWaterForwardBase(TS_VertexInput v)
|
|||
|
{
|
|||
|
UNITY_SETUP_INSTANCE_ID(v);
|
|||
|
TS_WaterVertexOutputForwardBase o;
|
|||
|
UNITY_INITIALIZE_OUTPUT(TS_WaterVertexOutputForwardBase, o);
|
|||
|
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
|||
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
|||
|
|
|||
|
TS_ApplyVertexWaves(v);
|
|||
|
|
|||
|
float4 posWorld = mul(unity_ObjectToWorld, v.vertex);
|
|||
|
#if UNITY_REQUIRE_FRAG_WORLDPOS
|
|||
|
#if UNITY_PACK_WORLDPOS_WITH_TANGENT
|
|||
|
o.tangentToWorldAndPackedData[0].w = posWorld.x;
|
|||
|
o.tangentToWorldAndPackedData[1].w = posWorld.y;
|
|||
|
o.tangentToWorldAndPackedData[2].w = posWorld.z;
|
|||
|
#else
|
|||
|
o.posWorld = posWorld.xyz;
|
|||
|
#endif
|
|||
|
#endif
|
|||
|
o.pos = UnityObjectToClipPos(v.vertex);
|
|||
|
|
|||
|
o.tex = TexCoords((VertexInput)v);
|
|||
|
o.eyeVec.xyz = NormalizePerVertexNormal(posWorld.xyz - _WorldSpaceCameraPos);
|
|||
|
float3 normalWorld = UnityObjectToWorldNormal(v.normal);
|
|||
|
#ifdef _TANGENT_TO_WORLD
|
|||
|
float4 tangentWorld = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
|
|||
|
float3x3 tangentToWorld = CreateTangentToWorldPerVertex(normalWorld, tangentWorld.xyz, tangentWorld.w);
|
|||
|
o.tangentToWorldAndPackedData[0].xyz = tangentToWorld[0];
|
|||
|
o.tangentToWorldAndPackedData[1].xyz = tangentToWorld[1];
|
|||
|
o.tangentToWorldAndPackedData[2].xyz = tangentToWorld[2];
|
|||
|
#else
|
|||
|
o.tangentToWorldAndPackedData[0].xyz = 0;
|
|||
|
o.tangentToWorldAndPackedData[1].xyz = 0;
|
|||
|
o.tangentToWorldAndPackedData[2].xyz = normalWorld;
|
|||
|
#endif
|
|||
|
UNITY_TRANSFER_LIGHTING(o, v.uv1);
|
|||
|
o.ambientOrLightmapUV = VertexGIForward((VertexInput)v, posWorld, normalWorld);
|
|||
|
#ifdef _PARALLAXMAP
|
|||
|
TANGENT_SPACE_ROTATION;
|
|||
|
half3 viewDirForParallax = mul (rotation, ObjSpaceViewDir(v.vertex));
|
|||
|
o.tangentToWorldAndPackedData[0].w = viewDirForParallax.x;
|
|||
|
o.tangentToWorldAndPackedData[1].w = viewDirForParallax.y;
|
|||
|
o.tangentToWorldAndPackedData[2].w = viewDirForParallax.z;
|
|||
|
#endif
|
|||
|
UNITY_TRANSFER_FOG_COMBINED_WITH_EYE_VEC(o, o.pos);
|
|||
|
|
|||
|
o.color = v.color;
|
|||
|
o.screenPos = ComputeScreenPos(o.pos);
|
|||
|
o.viewNormal = COMPUTE_VIEW_NORMAL;
|
|||
|
|
|||
|
return o;
|
|||
|
}
|
|||
|
|
|||
|
TS_WaterVertexOutputForwardAdd TS_VertWaterForwardAdd(TS_VertexInput v)
|
|||
|
{
|
|||
|
UNITY_SETUP_INSTANCE_ID(v);
|
|||
|
TS_WaterVertexOutputForwardAdd o;
|
|||
|
UNITY_INITIALIZE_OUTPUT(TS_WaterVertexOutputForwardAdd, o);
|
|||
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
|||
|
|
|||
|
TS_ApplyVertexWaves(v);
|
|||
|
|
|||
|
float4 posWorld = mul(unity_ObjectToWorld, v.vertex);
|
|||
|
o.pos = UnityObjectToClipPos(v.vertex);
|
|||
|
|
|||
|
o.tex = TexCoords((VertexInput)v);
|
|||
|
o.eyeVec.xyz = NormalizePerVertexNormal(posWorld.xyz - _WorldSpaceCameraPos);
|
|||
|
o.posWorld = posWorld.xyz;
|
|||
|
float3 normalWorld = UnityObjectToWorldNormal(v.normal);
|
|||
|
#ifdef _TANGENT_TO_WORLD
|
|||
|
float4 tangentWorld = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
|
|||
|
float3x3 tangentToWorld = CreateTangentToWorldPerVertex(normalWorld, tangentWorld.xyz, tangentWorld.w);
|
|||
|
o.tangentToWorldAndLightDir[0].xyz = tangentToWorld[0];
|
|||
|
o.tangentToWorldAndLightDir[1].xyz = tangentToWorld[1];
|
|||
|
o.tangentToWorldAndLightDir[2].xyz = tangentToWorld[2];
|
|||
|
#else
|
|||
|
o.tangentToWorldAndLightDir[0].xyz = 0;
|
|||
|
o.tangentToWorldAndLightDir[1].xyz = 0;
|
|||
|
o.tangentToWorldAndLightDir[2].xyz = normalWorld;
|
|||
|
#endif
|
|||
|
UNITY_TRANSFER_LIGHTING(o, v.uv1);
|
|||
|
|
|||
|
float3 lightDir = _WorldSpaceLightPos0.xyz - posWorld.xyz * _WorldSpaceLightPos0.w;
|
|||
|
#ifndef USING_DIRECTIONAL_LIGHT
|
|||
|
lightDir = NormalizePerVertexNormal(lightDir);
|
|||
|
#endif
|
|||
|
o.tangentToWorldAndLightDir[0].w = lightDir.x;
|
|||
|
o.tangentToWorldAndLightDir[1].w = lightDir.y;
|
|||
|
o.tangentToWorldAndLightDir[2].w = lightDir.z;
|
|||
|
#ifdef _PARALLAXMAP
|
|||
|
TANGENT_SPACE_ROTATION;
|
|||
|
o.viewDirForParallax = mul (rotation, ObjSpaceViewDir(v.vertex));
|
|||
|
#endif
|
|||
|
UNITY_TRANSFER_FOG_COMBINED_WITH_EYE_VEC(o, o.pos);
|
|||
|
|
|||
|
o.color = v.color;
|
|||
|
o.screenPos = ComputeScreenPos(o.pos);
|
|||
|
o.viewNormal = COMPUTE_VIEW_NORMAL;
|
|||
|
|
|||
|
return o;
|
|||
|
}
|
|||
|
|
|||
|
fixed4 TS_FragWaterForwardBase(TS_WaterVertexOutputForwardBase i) : SV_Target
|
|||
|
{
|
|||
|
UNITY_APPLY_DITHER_CROSSFADE(i.pos.xy);
|
|||
|
|
|||
|
UNITY_SETUP_INSTANCE_ID(i);
|
|||
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|||
|
|
|||
|
FragmentCommonData s = TS_WaterFragmentSetup(i.tex, i.eyeVec.xyz, IN_VIEWDIR4PARALLAX(i), i.tangentToWorldAndPackedData, IN_WORLDPOS(i),
|
|||
|
i.color, i.viewNormal, i.screenPos);
|
|||
|
|
|||
|
UnityLight light = MainLight();
|
|||
|
UNITY_LIGHT_ATTENUATION(atten, i, s.posWorld);
|
|||
|
|
|||
|
UnityGI gi = FragmentGI(s, 1, i.ambientOrLightmapUV, 1, light, false);
|
|||
|
|
|||
|
TS_LightingData l = TS_WaterCalculateLighting(s, gi.light, gi.indirect, atten, i.tex.xy);
|
|||
|
|
|||
|
#ifdef TS_VERTEXFORWARDBASE_SHADINGPASS
|
|||
|
half4 color = TS_VERTEXFORWARDBASE_SHADINGPASS(s, l);
|
|||
|
#else
|
|||
|
half4 color = TS_WaterShading(s, l);
|
|||
|
#endif
|
|||
|
|
|||
|
UNITY_EXTRACT_FOG_FROM_EYE_VEC(i);
|
|||
|
UNITY_APPLY_FOG(_unity_fogCoord, color.rgb);
|
|||
|
|
|||
|
return OutputForward(color, s.alpha);
|
|||
|
}
|
|||
|
|
|||
|
fixed4 TS_FragWaterForwardAdd(TS_WaterVertexOutputForwardAdd i) : SV_Target
|
|||
|
{
|
|||
|
UNITY_APPLY_DITHER_CROSSFADE(i.pos.xy);
|
|||
|
|
|||
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|||
|
|
|||
|
FragmentCommonData s = TS_WaterFragmentSetup(i.tex, i.eyeVec.xyz, IN_VIEWDIR4PARALLAX_FWDADD(i), i.tangentToWorldAndLightDir, IN_WORLDPOS_FWDADD(i),
|
|||
|
i.color, i.viewNormal, i.screenPos);
|
|||
|
|
|||
|
UNITY_LIGHT_ATTENUATION(atten, i, s.posWorld)
|
|||
|
|
|||
|
TS_LightingData l = TS_WaterCalculateLighting(s, AdditiveLight(IN_LIGHTDIR_FWDADD(i), 1), ZeroIndirect(), atten, i.tex.xy);
|
|||
|
|
|||
|
#ifdef TS_VERTEXFORWARDADD_SHADINGPASS
|
|||
|
half4 color = TS_VERTEXFORWARDADD_SHADINGPASS(s, l);
|
|||
|
#else
|
|||
|
half4 color = TS_WaterShading(s, l);
|
|||
|
#endif
|
|||
|
|
|||
|
UNITY_EXTRACT_FOG_FROM_EYE_VEC(i);
|
|||
|
UNITY_APPLY_FOG_COLOR(_unity_fogCoord, color.rgb, half4(0, 0, 0, 0));
|
|||
|
|
|||
|
return OutputForward(color, s.alpha);
|
|||
|
}
|
|||
|
|
|||
|
#endif
|