[A] color [M] NDC position insted screen pos

This commit is contained in:
2024-07-10 15:57:52 +08:00
parent a825cf9d1c
commit b8413b6f9a
7 changed files with 62 additions and 22 deletions

View File

@@ -20,8 +20,8 @@ MonoBehaviour:
- {fileID: 11400000, guid: 707360a9c581a4bd7aa53bfeb1429f71, type: 2} - {fileID: 11400000, guid: 707360a9c581a4bd7aa53bfeb1429f71, type: 2}
m_DefaultRendererIndex: 0 m_DefaultRendererIndex: 0
m_RequireDepthTexture: 1 m_RequireDepthTexture: 1
m_RequireOpaqueTexture: 0 m_RequireOpaqueTexture: 1
m_OpaqueDownsampling: 1 m_OpaqueDownsampling: 0
m_SupportsTerrainHoles: 1 m_SupportsTerrainHoles: 1
m_SupportsHDR: 0 m_SupportsHDR: 0
m_HDRColorBufferPrecision: 0 m_HDRColorBufferPrecision: 0

View File

@@ -90,6 +90,8 @@ Material:
- _ClearCoatSmoothness: 0 - _ClearCoatSmoothness: 0
- _Cull: 2 - _Cull: 2
- _Cutoff: 0.5 - _Cutoff: 0.5
- _DepthHorizontal: 1.39
- _DepthVertical: 3.69
- _DetailAlbedoMapScale: 1 - _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1 - _DetailNormalMapScale: 1
- _DstBlend: 0 - _DstBlend: 0
@@ -119,10 +121,11 @@ Material:
- _WorkflowMode: 1 - _WorkflowMode: 1
- _ZWrite: 1 - _ZWrite: 1
m_Colors: m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1} - _BaseColor: {r: 0.024964403, g: 0.23726082, b: 0.4811321, a: 0.8862745}
- _Color: {r: 1, g: 1, b: 1, a: 1} - _Color: {r: 1, g: 1, b: 1, a: 1}
- _Direction: {r: 0, g: -1, b: 0, a: 0} - _Direction: {r: 0, g: -1, b: 0, a: 0}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _ShallowColor: {r: 0.06430225, g: 0.8018868, b: 0.79103994, a: 0.27450982}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
- _WaveDirection: {r: 1, g: 1, b: 1, a: 1} - _WaveDirection: {r: 1, g: 1, b: 1, a: 1}
- _WaveFadeDistance: {r: 150, g: 300, b: 0, a: 0} - _WaveFadeDistance: {r: 150, g: 300, b: 0, a: 0}

View File

@@ -25,6 +25,7 @@ struct WaterSurface
float3 albedo; float3 albedo;
float3 offset; float3 offset;
float alpha; float alpha;
float fog;
}; };
struct SceneDepth struct SceneDepth
@@ -40,15 +41,16 @@ struct SceneDepth
#define DEPTH_SCALAR (FAR_CLIP - NEAR_CLIP) #define DEPTH_SCALAR (FAR_CLIP - NEAR_CLIP)
//Return depth based on the used technique (buffer, vertex color, baked texture) //Return depth based on the used technique (buffer, vertex color, baked texture)
SceneDepth SampleDepth(float4 screenPos) SceneDepth SampleDepth(float4 positionNDC)
{ {
SceneDepth depth = (SceneDepth)0; SceneDepth depth = (SceneDepth)0;
screenPos.xyz /= screenPos.w; positionNDC.xy /= positionNDC.w;
depth.raw = SampleSceneDepth(screenPos.xy); float raw = SampleSceneDepth(positionNDC.xy);
depth.eye = LinearEyeDepth(depth.raw, _ZBufferParams); depth.raw = raw;
depth.linear01 = Linear01Depth(depth.raw, _ZBufferParams) * DEPTH_SCALAR; depth.eye = LinearEyeDepth(raw, _ZBufferParams);
depth.linear01 = Linear01Depth(raw, _ZBufferParams) * DEPTH_SCALAR;
return depth; return depth;
} }

View File

@@ -1,7 +1,7 @@
struct SceneData struct SceneData
{ {
float4 positionSS; //Unnormalized float4 positionNDC; //Unnormalized
float2 screenPos; //Normalized and no refraction float2 screenPos; //Normalized and no refraction
float3 positionWS; float3 positionWS;
@@ -9,18 +9,18 @@ struct SceneData
float verticalDepth; float verticalDepth;
}; };
void PopulateSceneData(inout SceneData scene, in Varyings input, in WaterSurface water, in float3 camPos) void PopulateSceneData(inout SceneData scene, in Varyings input, in WaterSurface water)
{ {
scene.positionSS = input.screenPos; scene.positionNDC = input.positionNDC;
scene.screenPos = input.screenPos.xy / input.screenPos.w; scene.screenPos = input.positionNDC.xy / input.positionNDC.w;
//Default for disabled depth texture //Default for disabled depth texture
scene.viewDepth = 1; scene.viewDepth = 1;
scene.verticalDepth = 1; scene.verticalDepth = 1;
//Screen depth Projection to world position //Screen depth Projection to world position
SceneDepth depth = SampleDepth(scene.positionSS); SceneDepth depth = SampleDepth(input.positionNDC);
float3 projWorldPos = depth.eye * (water.viewDir / input.screenPos.w) - camPos; float3 projWorldPos = depth.eye * (water.viewDelta / input.positionNDC.w) - _WorldSpaceCameraPos;
scene.positionWS = -projWorldPos; scene.positionWS = -projWorldPos;
const float sceneDepth = depth.eye; const float sceneDepth = depth.eye;
@@ -33,12 +33,24 @@ void PopulateSceneData(inout SceneData scene, in Varyings input, in WaterSurface
//scene.verticalDepth = DepthDistance(water.positionWS, scene.positionWS, water.waveNormal * normalSign); //scene.verticalDepth = DepthDistance(water.positionWS, scene.positionWS, water.waveNormal * normalSign);
} }
float GetWaterDensity(SceneData scene, float heightScalar, float viewDepthScalar)
{
//Best default value, otherwise water just turns invisible (infinitely shallow)
float density = 1.0;
float viewDepth = scene.viewDepth;
float verticalDepth = scene.verticalDepth;
float depthAttenuation = 1.0 - exp(-viewDepth * viewDepthScalar * 0.1);
float heightAttenuation = saturate(verticalDepth * heightScalar);
return max(depthAttenuation, heightAttenuation);
}
float4 ForwardPassFragment(Varyings input) : SV_Target float4 ForwardPassFragment(Varyings input) : SV_Target
{ {
WaterSurface water = (WaterSurface)0; WaterSurface water = (WaterSurface)0;
SceneData scene = (SceneData)0; SceneData scene = (SceneData)0;
float3 camPos = GetCurrentViewPosition();
float3 normalWS = normalize(input.normalWS.xyz); float3 normalWS = normalize(input.normalWS.xyz);
float3 WorldTangent = input.tangent.xyz; float3 WorldTangent = input.tangent.xyz;
@@ -48,14 +60,20 @@ float4 ForwardPassFragment(Varyings input) : SV_Target
water.alpha = 1.0; water.alpha = 1.0;
water.positionWS = positionWS; water.positionWS = positionWS;
water.viewDelta = camPos - scene.positionWS; water.viewDelta = _WorldSpaceCameraPos - positionWS;
water.viewDir = normalize(water.viewDelta); water.viewDir = normalize(water.viewDelta);
water.vertexNormal = normalize(input.normalWS.xyz); water.vertexNormal = normalize(input.normalWS.xyz);
half VdotN = 1.0 - saturate(dot(water.viewDir, normalWS)); half VdotN = 1.0 - saturate(dot(water.viewDir, normalWS));
PopulateSceneData(scene, input, water, camPos); PopulateSceneData(scene, input, water);
return float4(scene.viewDepth.xxx, 1); //return float4(scene.verticalDepth.xxx, 1);
water.fog = GetWaterDensity(scene, _DepthHorizontal, _DepthVertical);
//Albedo
float4 baseColor = lerp(_ShallowColor, _BaseColor, water.fog);
return baseColor;
} }

View File

@@ -4,6 +4,12 @@ CBUFFER_START(UnityPerMaterial)
float2 _Direction; float2 _Direction;
float _Speed; float _Speed;
//Color + Transparency
half4 _BaseColor;
half4 _ShallowColor;
float _DepthVertical;
float _DepthHorizontal;
//Waves //Waves
float _WaveSpeed; float _WaveSpeed;
half _WaveHeight; half _WaveHeight;

View File

@@ -22,7 +22,7 @@ struct Varyings
//wPos.z in w-component //wPos.z in w-component
float4 bitangent : TEXCOORD4; float4 bitangent : TEXCOORD4;
float4 screenPos : TEXCOORD5; float4 positionNDC : TEXCOORD5;
float4 positionCS : SV_POSITION; float4 positionCS : SV_POSITION;
@@ -53,9 +53,14 @@ Varyings LitPassVertex(Attributes input)
//Apply vertex displacements //Apply vertex displacements
positionWS += waves.position.xyz; positionWS += waves.position.xyz;
output.positionCS = TransformWorldToHClip(positionWS); float4 positionCS = TransformWorldToHClip(positionWS);
output.screenPos = ComputeScreenPos(output.positionCS); output.positionCS = positionCS;
float4 ndc = positionCS * 0.5f;
ndc.xy = float2(ndc.x, ndc.y * _ProjectionParams.x) + ndc.w;
ndc.zw = positionCS.zw;
output.positionNDC = ndc;
output.normalWS = float4(normalInput.normalWS, positionWS.x); output.normalWS = float4(normalInput.normalWS, positionWS.x);
output.tangent = float4(normalInput.tangentWS, positionWS.y); output.tangent = float4(normalInput.tangentWS, positionWS.y);

View File

@@ -5,6 +5,12 @@ Shader "zzwater/ocean"
_Direction("Animation direction", Vector) = (0,-1,0,0) _Direction("Animation direction", Vector) = (0,-1,0,0)
_Speed("Animation Speed", Float) = 1 _Speed("Animation Speed", Float) = 1
//Color + Transparency
[HDR]_BaseColor("Deep", Color) = (0, 0.44, 0.62, 1)
[HDR]_ShallowColor("Shallow", Color) = (0.1, 0.9, 0.89, 0.02)
_DepthVertical("View Depth", Range(0.01 , 16)) = 4
_DepthHorizontal("Vertical Height Depth", Range(0.01 , 8)) = 1
//waves //waves
_WaveSpeed("Speed", Float) = 2 _WaveSpeed("Speed", Float) = 2
_WaveHeight("Height", Range(0 , 10)) = 0.25 _WaveHeight("Height", Range(0 , 10)) = 0.25