Files
3d-bianpo/Assets/URPWater/Shaders/HLSL/Includes/URPWaterVariables.hlsl
2026-03-03 11:30:53 +08:00

306 lines
7.4 KiB
HLSL

//-----------------------------------------------------------------------------
// 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_VARIABLES_INCLUDED
#define URPWATER_VARIABLES_INCLUDED
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"
#define URP_WATER_PI 3.1415926535
TEXTURE2D(_CausticsTex);
TEXTURE3D(_CausticsTex3D);
TEXTURE2D(_FoamTex);
TEXTURE2D(_NormalMapA);
TEXTURE2D(_NormalMapB);
TEXTURE2D(_NormalMapFar);
TEXTURE2D(_FlowMap);
//UNITY_DECLARE_SCREENSPACE_TEXTURE_FLOAT(_CameraDepthTexture); // VR
//UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraOpaqueTexture); // VR
TEXTURE2D(_RefractionColor);
TEXTURE2D(_DynamicEffectsTexture);
SAMPLER(sampler_CameraOpaqueTexture_linear_clamp);
SAMPLER(sampler_ScreenTextures_linear_clamp);
SAMPLER(sampler_pointTextures_point_clamp);
TEXTURE2D(_ReflectionTexture);
TEXTURECUBE(_CubemapTexture);
SAMPLER(sampler_CubemapTexture);
SamplerState URPWater_trilinear_repeat_sampler;
SamplerState URPWater_linear_repeat_sampler;
SamplerState URPWater_linear_clamp_sampler;
#if UNITY_VERSION <= 202310 || UNITY_VERSION < 202320
float4 _CameraOpaqueTexture_TexelSize;
float4 _CameraDepthTexture_TexelSize;
#endif
float4 _DynamicEffectsTexture_TexelSize;
float4 _DynamicEffectsParams;
UNITY_INSTANCING_BUFFER_START(UnityPerMaterial)
float4 _NormalMapA_ST;
float4 _NormalMapASpeeds;
float4 _NormalMapATilings;
float4 _NormalMapB_ST;
float4 _NormalMapBSpeeds;
float4 _NormalMapBTilings;
float4 _NormalMapFarTilings;
float4 _NormalMapFarSpeeds;
float4 _FlowTiling;
float4 _CausticsTiling;
float4 _Color;
float4 _DepthColor;
float4 _UnderWaterColor;
//float4 _AmbientColor;
float4 _SpecColor;
float4 _CausticsSpeed;
float4 _CausticsSpeed3D;
float4 _ScatteringColor;
float4 _FoamColor;
float4 _FoamTiling;
float4 _OceanInfos;
float _CausticsStart;
float _CausticsEnd;
float _CausticsTiling3D;
float _CausticsDistortion;
float _Distortion;
float _Smoothness;
float _NormalMapAIntensity;
float _NormalMapBIntensity;
float _NormalMapFarIntensity;
float _NormalFarDistance;
float _FlowSpeed;
float _FlowIntensity;
float _DepthStart;
float _DepthEnd;
float _ReflectionDistortion;
float _ReflectionFresnelNormal;
float _ReflectionRoughness;
float _EdgeSize;
float _CausticsIntensity;
float _ReflectionFresnel;
float _ReflectionIntensity;
float _FoamSize;
float _FoamRippleDistance;
float _FoamRippleSize;
float _FoamRippleSpeed;
float _FoamDistortion;
float _FoamCapsRangeMin;
float _FoamCapsRangeMax;
float _FoamCapsIntensity;
float _ScatteringIntensity;
float _ScatteringRangeMin;
float _ScatteringRangeMax;
float _CapsScatteringIntensity;
float _CapsScatteringRangeMin;
float _CapsScatteringRangeMax;
float _CapsScatterNormals;
float _DynamicNormal;
float _DynamicFoam;
float _DynamicDisplacement;
float _WaveNormal;
float _WaveEffectsBoost;
float _WaveCount;
float _WaveLength;
float _WaveAmplitude;
float _WaveSteepness;
float _WaveSpeed;
float _WaveStartDistance;
float _WaveEndDistance;
float _ClustersCount;
float _WavesPerCluster;
float4 _WaveParams1;
float4 _WaveParams2;
float4 _WaveParams3;
float4 _WaveParams4;
float4 _WaveOffsets;
float _Tess;
UNITY_INSTANCING_BUFFER_END(UnityPerMaterial)
struct Attributes
{
float4 vertex : POSITION;
float4 color : COLOR;
float3 normal : NORMAL;
float4 tangent : TANGENT;
float2 texcoord : TEXCOORD0;
#if _DISPLACEMENTMODE_GERSTNER || _DISPLACEMENTMODE_GERSTNERPLUS
float waveHeight : TEXCOORD1;
#endif
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct Varyings
{
float4 pos : SV_POSITION;
half4 color : COLOR;
half4 normal : NORMAL;
half4 tangent : TANGENT;
half4 binormal : BINORMAL;
float4 texcoord : TEXCOORD0;
#if _NORMALSMODE_DUAL || _FOAM_ON
float4 texcoord1 : TEXCOORD1;
#endif
#if _NORMAL_FAR_ON
float4 texcoord2 : TEXCOORD2;
#endif
// X: Far Distance, Y: Waves Height Z: W:
#if _NORMAL_FAR_ON || _DISPLACEMENTMODE_GERSTNER || _DISPLACEMENTMODE_GERSTNERPLUS
float4 texcoord3 : TEXCOORD3;
#endif
float4 screenCoord : TEXCOORD4;
#if _DYNAMIC_EFFECTS_ON
float2 projectionUV : TEXCOORD5;
#endif
#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)
float4 shadowCoord : TEXCOORD6;
#endif
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
void InitializeVertexData(inout Varyings IN)
{
IN.pos = float4(0, 0, 0, 0);
IN.color = half4(0, 0, 0, 0);
IN.normal = half4(0, 1, 0, 0);
IN.tangent = half4(1, 0, 0, 0);
IN.binormal = half4(0, 0, 1, 0);
IN.texcoord = float4(0, 0, 0, 0);
IN.screenCoord = float4(0, 0, 0, 0);
#if _NORMALSMODE_DUAL || _FOAM_ON
IN.texcoord1 = float4(0, 0, 0, 0);
#endif
#if _NORMAL_FAR_ON
IN.texcoord2 = float4(0, 0, 0, 0);
#endif
#if _NORMAL_FAR_ON || _DISPLACEMENTMODE_GERSTNER || _DISPLACEMENTMODE_GERSTNERPLUS
IN.texcoord3 = float4(0, 0, 0, 0);
#endif
#if _DYNAMIC_EFFECTS_ON
float2 projectionUV = float2(0, 0);
#endif
#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)
IN.shadowCoord = float4(0, 0, 0, 0);
#endif
}
struct GlobalData
{
float depth; // Remapped Depth
float sceneDepth; // Linear Depth
float rawDepthDst; // Raw Depth Distorted
float pixelDepth;
float foamMask;
float2 refractionOffset;
float2 refractionUV;
float3 finalColor;
float4 refractionData; // RGB: Refraction Color A: Refraction Depth
float3 clearColor; // RGB: Clear Color
float3 shadowColor;
float3 worldPosition;
float3 worldNormal;
float3 worldViewDir;
float4 screenUV;
#if _DYNAMIC_EFFECTS_ON
float4 dynamicData;
#endif
#if _DOUBLE_SIDED_ON
float vFace;
#endif
#if _SCATTERING_ON
float3 scattering;
#endif
Light mainLight;
float3 addLight;
float3x3 tangentToWorld;
// Debug purpose only
float4 debug;
};
void InitializeGlobalData(inout GlobalData data, Varyings IN)
{
data.worldPosition = float3(IN.normal.w, IN.tangent.w, IN.binormal.w);
data.worldNormal = float3(0, 1, 0);
data.worldViewDir = GetWorldSpaceNormalizeViewDir(data.worldPosition);//SafeNormalize(_WorldSpaceCameraPos.xyz - data.worldPosition);
data.screenUV = float4(IN.screenCoord.xyz / IN.screenCoord.w, IN.pos.z); //ComputeScreenPos(TransformWorldToHClip(data.worldPosition), _ProjectionParams.x);
data.depth = 0;
data.sceneDepth = 0;
data.rawDepthDst = 0;
data.pixelDepth = -TransformWorldToView(data.worldPosition).z; //IN.screenCoord.a;
data.foamMask = 0;
data.refractionOffset = float2(0, 0);
data.refractionUV = float2(0, 0);
data.refractionData = float4(0, 0, 0 ,0);
data.clearColor = float3(1, 1, 1);
data.finalColor = float3(1, 1, 1);
data.shadowColor = float3(1, 1, 1);
#if _DYNAMIC_EFFECTS_ON
data.dynamicData = float4(0, 0, 0, 0);
#endif
#if _DOUBLE_SIDED_ON
data.vFace = 1;
#endif
#if _SCATTERING_ON
data.scattering = float3(0,0,0);
#endif
data.mainLight = GetMainLight(TransformWorldToShadowCoord(data.worldPosition));
data.addLight = float3(0, 0, 0);
data.tangentToWorld = float3x3(IN.tangent.xyz, IN.binormal.xyz, IN.normal.xyz);
data.debug = float4 (0, 0, 0, 1);
}
#endif