Browse Source

Alternative fix to occlusion culling where all math is based on Euclidean distance.

Rudolph Bester 10 months ago
parent
commit
ed3f990952

+ 1 - 11
modules/raycast/raycast_occlusion_cull.cpp

@@ -181,17 +181,7 @@ void RaycastOcclusionCull::RaycastHZBuffer::sort_rays(const Vector3 &p_camera_di
 					}
 					}
 					int k = tile_i * TILE_SIZE + tile_j;
 					int k = tile_i * TILE_SIZE + tile_j;
 					int tile_index = i * tile_grid_size.x + j;
 					int tile_index = i * tile_grid_size.x + j;
-					float d = camera_rays[tile_index].ray.tfar[k];
-
-					if (!p_orthogonal) {
-						const float &dir_x = camera_rays[tile_index].ray.dir_x[k];
-						const float &dir_y = camera_rays[tile_index].ray.dir_y[k];
-						const float &dir_z = camera_rays[tile_index].ray.dir_z[k];
-						float cos_theta = p_camera_dir.x * dir_x + p_camera_dir.y * dir_y + p_camera_dir.z * dir_z;
-						d *= cos_theta;
-					}
-
-					mips[0][y * buffer_size.x + x] = d;
+					mips[0][y * buffer_size.x + x] = camera_rays[tile_index].ray.tfar[k];
 				}
 				}
 			}
 			}
 		}
 		}

+ 5 - 1
servers/rendering/renderer_scene_occlusion_cull.h

@@ -72,7 +72,7 @@ public:
 				return false;
 				return false;
 			}
 			}
 
 
-			float min_depth = -closest_point_view.z * 0.95f;
+			float min_depth = (closest_point - p_cam_position).length();
 
 
 			Vector2 rect_min = Vector2(FLT_MAX, FLT_MAX);
 			Vector2 rect_min = Vector2(FLT_MAX, FLT_MAX);
 			Vector2 rect_max = Vector2(FLT_MIN, FLT_MIN);
 			Vector2 rect_max = Vector2(FLT_MIN, FLT_MIN);
@@ -83,6 +83,10 @@ public:
 				Vector3 corner = Vector3(p_bounds[0] * c.x + p_bounds[3] * nc.x, p_bounds[1] * c.y + p_bounds[4] * nc.y, p_bounds[2] * c.z + p_bounds[5] * nc.z);
 				Vector3 corner = Vector3(p_bounds[0] * c.x + p_bounds[3] * nc.x, p_bounds[1] * c.y + p_bounds[4] * nc.y, p_bounds[2] * c.z + p_bounds[5] * nc.z);
 				Vector3 view = p_cam_inv_transform.xform(corner);
 				Vector3 view = p_cam_inv_transform.xform(corner);
 
 
+				if (p_cam_projection.is_orthogonal()) {
+					min_depth = MIN(min_depth, view.z);
+				}
+
 				Plane vp = Plane(view, 1.0);
 				Plane vp = Plane(view, 1.0);
 				Plane projected = p_cam_projection.xform4(vp);
 				Plane projected = p_cam_projection.xform4(vp);