summaryrefslogtreecommitdiffstats
path: root/fog.cginc
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2025-06-07 18:16:32 -0700
committeryum <yum.food.vr@gmail.com>2025-06-07 19:54:57 -0700
commitb000eb9f08691df6ff07109d41e8ae2028799e9e (patch)
tree69def0deb707a12399b231fa43354c4ed1d5cd95 /fog.cginc
parentd888c25cfcf0da223bfa9e8312d825183a65122a (diff)
Convert fake origins code to tangent space
Diffstat (limited to 'fog.cginc')
-rw-r--r--fog.cginc59
1 files changed, 54 insertions, 5 deletions
diff --git a/fog.cginc b/fog.cginc
index 7f34795..6e471e9 100644
--- a/fog.cginc
+++ b/fog.cginc
@@ -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;
}