@@ -36,8 +36,9 @@ uniform float max_probe_lod;
3636uniform bool transparent_surface;
3737
3838uniform float ssrMipScale;
39+ uniform sampler2D ssrConeMipMap;
3940
40- float tapScreenSpaceReflection(int totalSamples, vec2 tc, vec3 viewPos, vec3 n, inout vec4 collectedColor, sampler2D source, float glossiness);
41+ float tapScreenSpaceReflection(int totalSamples, vec2 tc, vec3 viewPos, vec3 n, inout vec4 collectedColor, out float coneMipOut, sampler2D source, float glossiness);
4142
4243uniform int classic_mode;
4344
@@ -822,11 +823,16 @@ void doProbeSample(inout vec3 ambenv, inout vec3 glossenv,
822823
823824 if (transparent)
824825 {
825- tapScreenSpaceReflection(1 , tc, pos.xyz, norm, ssr, sceneMap, glossiness);
826+ float unusedMip;
827+ tapScreenSpaceReflection(1 , tc, pos.xyz, norm, ssr, unusedMip, sceneMap, glossiness);
826828 }
827829 else
828830 {
829- ssr = textureLod(sceneMap, tc, roughness * ssrMipScale);
831+ // Contact hardening: read cone mip from MRT1 for LOD selection,
832+ // sample color+confidence from MRT0 mip chain.
833+ float coneMip = texture(ssrConeMipMap, tc).r * ssrMipScale;
834+ float ssrLod = clamp (coneMip, 0.0 , ssrMipScale);
835+ ssr = textureLod(sceneMap, tc, ssrLod);
830836 }
831837
832838 if (ssr.a > 0.001 )
@@ -953,11 +959,14 @@ void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout
953959
954960 if (transparent)
955961 {
956- tapScreenSpaceReflection(1 , tc, pos.xyz, norm, ssr, sceneMap, glossiness);
962+ float unusedMip;
963+ tapScreenSpaceReflection(1 , tc, pos.xyz, norm, ssr, unusedMip, sceneMap, glossiness);
957964 }
958965 else
959966 {
960- float ssrLod = clamp (log2 (1.0 + roughness * roughness * ssrMipScale * 4.0 ), 0.0 , ssrMipScale);
967+ // Contact hardening: read cone mip from MRT1, sample color from MRT0.
968+ float coneMip = texture(ssrConeMipMap, tc).r * ssrMipScale;
969+ float ssrLod = clamp (coneMip, 0.0 , ssrMipScale);
961970 ssr = textureLod(sceneMap, tc, ssrLod);
962971 }
963972
0 commit comments