//----------------------------------------------------------------------------- // Copyright(C) Yan Verde - All Rights Reserved // Copyright protected under Unity Asset Store EULA // Refer to https://unity3d.com/legal/as_terms for more informations // ----------------------------------------------------------------------------- // URP Water // Author : Yan Verde // Date : April 10, 2021 // ----------------------------------------------------------------------------- #ifndef URPWATER_COMMON_INCLUDED #define URPWATER_COMMON_INCLUDED #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" Varyings vert(Attributes v) { Varyings OUT; UNITY_SETUP_INSTANCE_ID(v); UNITY_TRANSFER_INSTANCE_ID(v, OUT); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT); half3 worldTangent = half3(1, 0, 0); half3 worldNormal = half3(0, 1, 0); half3 worldBinormal = half3(0, 0, 1); //#ifndef _DISPLACEMENTMODE_GERSTNERPLUS #ifndef _WORLD_UV VertexNormalInputs vertexTBN = GetVertexNormalInputs(v.normal, v.tangent); worldNormal = vertexTBN.normalWS; worldBinormal = vertexTBN.bitangentWS;//TransformObjectToWorldDir(worldBinormal); worldTangent = vertexTBN.tangentWS;//TransformObjectToWorldDir(worldTangent); #endif //#endif // Gerstner Waves ComputeWaves(v, worldNormal, worldBinormal, worldTangent); // Compute Positions VertexPositionInputs vInputs = GetVertexPositionInputs(v.vertex.xyz); //TODO: Use for fog computation instead of redoing it in PS //vInputs.positionVS float3 worldPos = vInputs.positionWS; // Pack Directions and world position OUT.normal = float4(worldNormal, worldPos.x); OUT.tangent = float4((worldTangent), worldPos.y); OUT.binormal = float4((worldBinormal), worldPos.z); #if _DYNAMIC_EFFECTS_ON OUT.projectionUV = ProjectionUV(_DynamicEffectsParams, worldPos); float4 dynamicTex = SAMPLE_TEXTURE2D_LOD(_DynamicEffectsTexture, URPWater_linear_clamp_sampler, OUT.projectionUV, 0); float displacement = dynamicTex.a * _DynamicDisplacement; v.vertex.y += displacement; worldPos.y += displacement; #else float displacement = 0.0; #endif //TransformObjectToHClip(v.vertex.xyz); OUT.pos = vInputs.positionCS - float4(0.0, displacement, 0.0, 0.0); OUT.color = v.color; OUT.screenCoord = vInputs.positionNDC; // Pixel Depth in alpha //OUT.screenCoord.a = ComputePixelDepth(worldPos); // ComputeEyeDepth - Deprecated? Comment out if issues in VR #if _WORLD_UV v.texcoord.xy = worldPos.xz * 0.1; #endif //NormalMap UVa #if _NORMALSMODE_FLOWMAP OUT.texcoord.xy = v.texcoord.xy * _NormalMapATilings.xy; OUT.texcoord.zw = v.texcoord.xy * _FlowTiling.xy + _FlowTiling.zw; #else OUT.texcoord = DualAnimatedUV(v.texcoord, _NormalMapATilings, _NormalMapASpeeds); #endif #if _NORMALSMODE_DUAL || _FOAM_ON OUT.texcoord1 = float4(0, 0, 0, 0); #endif #if _NORMALSMODE_DUAL OUT.texcoord1.xy = AnimatedUV(v.texcoord.xy, _NormalMapBTilings.xy, _NormalMapBSpeeds.xy).xy; #endif #if _NORMAL_FAR_ON OUT.texcoord2 = DualAnimatedUV(v.texcoord, _NormalMapFarTilings, _NormalMapFarSpeeds); #endif #if _NORMAL_FAR_ON || _DISPLACEMENTMODE_GERSTNER || _DISPLACEMENTMODE_GERSTNERPLUS OUT.texcoord3 = float4(0, 0, 0, 0); OUT.texcoord3.x = saturate(OUT.screenCoord.z / _NormalFarDistance); #if _DISPLACEMENTMODE_GERSTNER || _DISPLACEMENTMODE_GERSTNERPLUS OUT.texcoord3.y = v.waveHeight; #endif #endif // FoamUV #if _FOAM_ON OUT.texcoord1.zw = v.texcoord.xy * _FoamTiling.xy; #endif // Shadows #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) OUT.shadowCoord = GetShadowCoord(vInputs); #endif return OUT; } FRONT_FACE_TYPE vFace : FRONT_FACE_SEMANTIC; #if _DOUBLE_SIDED_ON float4 frag(Varyings IN, FRONT_FACE_TYPE vFace : FRONT_FACE_SEMANTIC) : SV_Target #else float4 frag(Varyings IN) : SV_Target #endif { UNITY_SETUP_INSTANCE_ID(IN); UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN); GlobalData data; InitializeGlobalData(data, IN); #if _DOUBLE_SIDED_ON data.vFace = IS_FRONT_VFACE(vFace, true, false); #endif ComputeDynamicData(data, IN); ComputeNormals(data, IN); ComputeRefractionData(data); ComputeScattering(data, IN); ComputeFoam(data, IN); ComputeLighting(data, IN); ComputeReflections(data, IN); //return float4(IN.tangent.rgb, 1); //return float4(IN.texcoord.rg,0, 1); //half NdotL = saturate(dot(data.worldNormal, data.mainLight.direction)); //return float4(NdotL.xxx, 1); //data.debug.rgb = data.worldViewDir; //return float4(data.debug.rgb, 1); Applyfog(data.finalColor, data.worldPosition); // Enviro Support //float linear01Depth = Linear01Depth(data.screenUV.z); //data.finalColor.rgb = TransparentFog(float4(data.finalColor.rgb, 1), data.worldPosition, data.screenUV.xy, linear01Depth).rgb; // End Enviro ComputeAlpha(data, IN); float4 output; output.rgb = data.finalColor.rgb; output.a = 1; return output; } #endif