@@ -875,6 +875,7 @@ uniform vec3 refprobe1_box_offset;
875
875
uniform highp mat4 refprobe1_local_matrix;
876
876
uniform bool refprobe1_exterior;
877
877
uniform float refprobe1_intensity;
878
+ uniform float refprobe1_blend_distance;
878
879
uniform int refprobe1_ambient_mode;
879
880
uniform vec4 refprobe1_ambient_color;
880
881
@@ -888,6 +889,7 @@ uniform vec3 refprobe2_box_offset;
888
889
uniform highp mat4 refprobe2_local_matrix;
889
890
uniform bool refprobe2_exterior;
890
891
uniform float refprobe2_intensity;
892
+ uniform float refprobe2_blend_distance;
891
893
uniform int refprobe2_ambient_mode;
892
894
uniform vec4 refprobe2_ambient_color;
893
895
@@ -1589,7 +1591,7 @@ void reflection_process(samplerCube reflection_map,
1589
1591
vec3 normal, vec3 vertex,
1590
1592
mat4 local_matrix,
1591
1593
bool use_box_project, vec3 box_extents, vec3 box_offset,
1592
- bool exterior, float intensity, int ref_ambient_mode, vec4 ref_ambient_color,
1594
+ bool exterior, float intensity, float blend_distance, int ref_ambient_mode, vec4 ref_ambient_color,
1593
1595
float roughness, vec3 ambient, vec3 skybox,
1594
1596
inout highp vec4 reflection_accum, inout highp vec4 ambient_accum) {
1595
1597
vec4 reflection;
@@ -1601,10 +1603,20 @@ void reflection_process(samplerCube reflection_map,
1601
1603
}
1602
1604
1603
1605
vec3 inner_pos = abs (local_pos / box_extents);
1604
- float blend = max (inner_pos.x, max (inner_pos.y, inner_pos.z));
1605
- blend = mix (length (inner_pos), blend, blend);
1606
- blend *= blend;
1606
+ vec3 blend_axes = vec3 (0.0 , 0.0 , 0.0 );
1607
+ float blend = 0.0 ;
1608
+ if (blend_distance != 0 ) {
1609
+ for (int i = 0 ; i < 3 ; i++ ) {
1610
+ float axis_blend_distance = min (blend_distance, box_extents[i]);
1611
+ blend_axes[i] = (inner_pos[i] * box_extents[i]) - box_extents[i] + axis_blend_distance;
1612
+ blend_axes[i] = blend_axes[i] / axis_blend_distance;
1613
+ blend_axes[i] = clamp (blend_axes[i], 0.0 , 1.0 );
1614
+ }
1615
+ blend = pow ((1.0 - blend_axes.x) * (1.0 - blend_axes.y) * (1.0 - blend_axes.z), 2 );
1616
+ blend = 1 - blend;
1617
+ }
1607
1618
blend = max (0.0 , 1.0 - blend);
1619
+ blend = clamp (blend, 0.0 , 1.0 );
1608
1620
1609
1621
// reflect and make local
1610
1622
vec3 ref_normal = normalize (reflect (vertex, normal));
@@ -1963,14 +1975,14 @@ void main() {
1963
1975
1964
1976
reflection_process(refprobe1_texture, normal, vertex_interp, refprobe1_local_matrix,
1965
1977
refprobe1_use_box_project, refprobe1_box_extents, refprobe1_box_offset,
1966
- refprobe1_exterior, refprobe1_intensity, refprobe1_ambient_mode, refprobe1_ambient_color,
1978
+ refprobe1_exterior, refprobe1_intensity, refprobe1_blend_distance, refprobe1_ambient_mode, refprobe1_ambient_color,
1967
1979
roughness, ambient_light, specular_light, reflection_accum, ambient_accum);
1968
1980
1969
1981
#ifdef SECOND_REFLECTION_PROBE
1970
1982
1971
1983
reflection_process(refprobe2_texture, normal, vertex_interp, refprobe2_local_matrix,
1972
1984
refprobe2_use_box_project, refprobe2_box_extents, refprobe2_box_offset,
1973
- refprobe2_exterior, refprobe2_intensity, refprobe2_ambient_mode, refprobe2_ambient_color,
1985
+ refprobe2_exterior, refprobe2_intensity, refprobe2_blend_distance, refprobe2_ambient_mode, refprobe2_ambient_color,
1974
1986
roughness, ambient_light, specular_light, reflection_accum, ambient_accum);
1975
1987
1976
1988
#endif // SECOND_REFLECTION_PROBE
0 commit comments