diff options
| author | yum <yum.food.vr@gmail.com> | 2025-06-07 18:16:32 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2025-06-07 19:54:57 -0700 |
| commit | b000eb9f08691df6ff07109d41e8ae2028799e9e (patch) | |
| tree | 69def0deb707a12399b231fa43354c4ed1d5cd95 /fog.cginc | |
| parent | d888c25cfcf0da223bfa9e8312d825183a65122a (diff) | |
Convert fake origins code to tangent space
Diffstat (limited to 'fog.cginc')
| -rw-r--r-- | fog.cginc | 59 |
1 files changed, 54 insertions, 5 deletions
@@ -9,6 +9,7 @@ #if defined(_RAYMARCHED_FOG) struct FogParams { + float3 color; float steps; float density; float y_cutoff; @@ -24,8 +25,47 @@ struct FogParams { float height_density_start; float height_density_half_life; #endif +#if defined(_CUSTOM30_FOG_HEIGHT_DENSITY_MINIMUM) + float height_density_minimum; +#endif +#if defined(_RAYMARCHED_FOG_EMITTER_TEXTURE) + texture2D emitter_texture; + float4 emitter_texture_texelsize; + float3 emitter_world_pos; + float3 emitter_normal; + float3 emitter_tangent; + float3 emitter_normal_x_tangent; + float2 emitter_scale; // [tangent scale in meters, bitangent scale in meters] + float2 emitter_scale_rcp; +#endif }; +#if defined(_RAYMARCHED_FOG_EMITTER_TEXTURE) +// Returns weighted color +float3 getEmitterData(FogParams p, float3 pp) +{ + // Using identity a_parallel_to_b = (dot(a, b) / dot(b, b)) * b + // float3 along_tangent = dot(p - em_loc, em_tangent) * em_tangent; + // float3 along_normal_x_tangent = dot(p - em_loc, em_normal_x_tangent) * + // em_normal_x_tangent; + // Given that em_tangent and em_normal_x_tangent are normalized, and the fact + // that we really want uvs, we can simplify this: + float2 uv = float2(dot(pp - p.emitter_world_pos, p.emitter_normal_x_tangent), dot(pp - p.emitter_world_pos, p.emitter_tangent)); + uv *= p.emitter_scale_rcp; + uv *= 0.5; + uv += 0.5; + + bool in_range = uv.x < 1 && uv.y < 1 && uv.x > 0 && uv.y > 0; + [branch] + if (!in_range) { + return p.color; + } + + float4 c = p.emitter_texture.SampleLevel(linear_clamp_s, uv, 0); + return lerp(p.color, c.rgb, c.a); +} +#endif + struct FogResult { float4 color; float depth; @@ -45,7 +85,6 @@ FogResult raymarched_fog(v2f i, FogParams p) float linearZ = GetLinearZFromZDepth_WorksWithMirrors(zDepthFromMap, screen_uv); - linearZ = min(1E3, linearZ); // Get intersection with plane at elevation y. float plane_y = p.y_cutoff; @@ -57,6 +96,7 @@ FogResult raymarched_fog(v2f i, FogParams p) } } linearZ = min(linearZ, distance_to_y); + linearZ = min(linearZ, 1200); linearZ -= ro_epsilon; float dither = p.dithering_noise.SampleLevel(point_repeat_s, @@ -69,7 +109,7 @@ FogResult raymarched_fog(v2f i, FogParams p) float step_size = linearZ / p.steps; float3 pp = ro; - float d = 0; + float4 color = 0; [loop] for (uint ii = 0; ii < p.steps; ++ii) { pp += step_size * rd; @@ -97,18 +137,27 @@ FogResult raymarched_fog(v2f i, FogParams p) // y=9 -> density = 1/8 float exponent = height_clamped / p.height_density_half_life; float factor = pow(2, -exponent); +#if defined(_CUSTOM30_FOG_HEIGHT_DENSITY_MINIMUM) + factor = max(factor, p.height_density_minimum); +#endif cur_d *= factor; #endif cur_d = saturate(cur_d); - d = d + (1 - d) * cur_d; + +#if defined(_RAYMARCHED_FOG_EMITTER_TEXTURE) + float4 cur_c = float4(getEmitterData(p, pp) * cur_d, cur_d); +#else + float4 cur_c = float4(p.color * cur_d, cur_d); +#endif + color += (1.0f - color.a) * cur_c; } FogResult r; - r.color.rgb = _Raymarched_Fog_Color; + r.color = color; //r.color.rgb = saturate(log(linearZ) / 5.0); //r.color.rgb = float3(screen_uv, 0); - r.color.a = d; + //r.color.a = d; r.depth = 0.0001; // Very small depth value to render in front return r; } |
