summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Editor/tooner.cs10
-rw-r--r--feature_macros.cginc1
-rw-r--r--fog.cginc27
-rw-r--r--tooner.shader1
4 files changed, 32 insertions, 7 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs
index 6358597..663a3d3 100644
--- a/Editor/tooner.cs
+++ b/Editor/tooner.cs
@@ -2104,6 +2104,16 @@ public class ToonerGUI : ShaderGUI {
if (bc.textureValue) {
EditorGUI.indentLevel += 1;
+ // TODO this is a misnomer, it's actually enabling normal-based
+ // lighting.
+ bc = FindProperty("_Gimmick_Fog_00_Emitter_Variable_Density");
+ enabled = (bc.floatValue != 0.0);
+ EditorGUI.BeginChangeCheck();
+ enabled = Toggle("Enable variable density", enabled);
+ EditorGUI.EndChangeCheck();
+ bc.floatValue = enabled ? 1.0f : 0.0f;
+ SetKeyword("_GIMMICK_FOG_00_EMITTER_VARIABLE_DENSITY", enabled);
+
bc = FindProperty("_Gimmick_Fog_00_Emitter0_Location");
VectorProperty(bc, "Location (world)");
bc = FindProperty("_Gimmick_Fog_00_Emitter0_Normal");
diff --git a/feature_macros.cginc b/feature_macros.cginc
index 388dc86..c367a25 100644
--- a/feature_macros.cginc
+++ b/feature_macros.cginc
@@ -215,6 +215,7 @@
#pragma shader_feature_local _ SSR_MASK
#pragma shader_feature_local _ _GIMMICK_FOG_00
#pragma shader_feature_local _ _GIMMICK_FOG_00_EMITTER_TEXTURE
+#pragma shader_feature_local _ _GIMMICK_FOG_00_EMITTER_VARIABLE_DENSITY
#pragma shader_feature_local _ _GIMMICK_FOG_00_EMITTER_1
#pragma shader_feature_local _ _GIMMICK_FOG_00_EMITTER_2
#pragma shader_feature_local _ _GIMMICK_FOG_00_RAY_MARCH_0
diff --git a/fog.cginc b/fog.cginc
index 53c4264..e979d6c 100644
--- a/fog.cginc
+++ b/fog.cginc
@@ -62,9 +62,9 @@ float map(float3 p, float lod) {
float3 pp = p * _Gimmick_Fog_00_Noise_Scale * FOG_PERLIN_NOISE_SCALE;
float density = FOG_PERLIN_NOISE(pp+t) * radius2 * 0.7;
- // Add higher octaves
+ // Add higher octave to create more visual interest
#if 1
- density += FOG_PERLIN_NOISE(pp*2+t*1.5) * radius2 * 0.3;
+ density += FOG_PERLIN_NOISE(pp*3+t*1.5) * radius2 * 0.3;
#endif
// Exponentiate to increase contrast.
@@ -304,8 +304,10 @@ Fog00PBR getFog00(v2f i) {
float3 diffuse_light = 0;
- // Seems that this is basically free.
-#if defined(_GIMMICK_FOG_00_EMITTER_TEXTURE)
+ // We put the emitter color into diffuse instead of doing a directional
+ // calculation because it looks better and it's cheaper. Less accurate
+ // though!
+#if defined(_GIMMICK_FOG_00_EMITTER_TEXTURE) && !defined(_GIMMICK_FOG_00_EMITTER_VARIABLE_DENSITY)
diffuse_light += getEmitterData(p, step_size, em_loc, em_normal, em_scale, em_scale_rcp) * step_size;
#endif
#if defined(_GIMMICK_FOG_00_RAY_MARCH_0)
@@ -340,13 +342,24 @@ Fog00PBR getFog00(v2f i) {
// TODO this should scale based on distance
float dd_e = 1 * noise_scale_rcp;
float NoL = saturate((map(p + dd_e * direct_light.dir, lod) - map_p_raw)/dd_e);
+ float3 c_lit = 0;
#if 1
- c.rgb = light_fog00(
+ c_lit += light_fog00(
c.rgb,
NoL,
- direct_light.color,
- indirect_light.diffuse + diffuse_light);
+ direct_light.color * step_size,
+ indirect_light.diffuse * step_size + diffuse_light);
+#endif
+#if defined(_GIMMICK_FOG_00_EMITTER_TEXTURE) && defined(_GIMMICK_FOG_00_EMITTER_VARIABLE_DENSITY)
+ float3 em_c = getEmitterData(p, step_size, em_loc, em_normal, em_scale, em_scale_rcp) * step_size;
+ float em_NoL = saturate((map(p + dd_e * em_normal, lod) - map_p_raw) / dd_e);
+ c_lit += light_fog00(
+ c.rgb,
+ em_NoL,
+ em_c,
+ 0);
#endif
+ c.rgb = c_lit;
acc += c * (1.0 - acc.a);
diff --git a/tooner.shader b/tooner.shader
index 2d5882e..2428c50 100644
--- a/tooner.shader
+++ b/tooner.shader
@@ -659,6 +659,7 @@ Shader "yum_food/tooner"
_Gimmick_Fog_00_Lod_Half_Life("fog", Float) = 5
_Gimmick_Fog_00_Emitter_Texture("Emitter texture", 2D) = "black" {}
+ _Gimmick_Fog_00_Emitter_Variable_Density("Enable emitter variable density", Float) = 0
_Gimmick_Fog_00_Emitter_Brightness("fog", Float) = 1
_Gimmick_Fog_00_Emitter_Lod_Half_Life("fog", Float) = 5