diff --git a/src/projects/gaussianviewer/renderer/CMakeLists.txt b/src/projects/gaussianviewer/renderer/CMakeLists.txt
index 53611a8bc819336edbf4630d40cb891b2c0ae4c9..8aaf7154a727db1ec459288d2bcc31096ce7dd98 100644
--- a/src/projects/gaussianviewer/renderer/CMakeLists.txt
+++ b/src/projects/gaussianviewer/renderer/CMakeLists.txt
@@ -12,7 +12,7 @@ project(sibr_${SIBR_PROJECT} LANGUAGES CXX)
 
 sibr_gitlibrary(TARGET CudaRasterizer
     GIT_REPOSITORY 	"https://github.com/graphdeco-inria/diff-gaussian-rasterization.git"
-    GIT_TAG			"3a07ac2e39b9ba7043ffc8bb98397c3ba6e2532d"
+    GIT_TAG			"1fe347d3dc87ab8b538e3d09d3b1105fc8fae4be"
 )
 
 find_package(CUDAToolkit REQUIRED)
diff --git a/src/projects/gaussianviewer/renderer/GaussianView.cpp b/src/projects/gaussianviewer/renderer/GaussianView.cpp
index 01e9bc0f1edcdd955bce006db5b82b9c0e6744cd..9eaa673da2147a7f59c64c50d32b9e544f5dd0cb 100644
--- a/src/projects/gaussianviewer/renderer/GaussianView.cpp
+++ b/src/projects/gaussianviewer/renderer/GaussianView.cpp
@@ -281,6 +281,7 @@ sibr::GaussianView::GaussianView(const sibr::BasicIBRScene::Ptr & ibrScene, uint
 	cudaMalloc((void**)&proj_cuda, sizeof(sibr::Matrix4f));
 	cudaMalloc((void**)&cam_pos_cuda, 3 * sizeof(float));
 	cudaMalloc((void**)&background_cuda, 3 * sizeof(float));
+	cudaMalloc((void**)&rect_cuda, 2 * P * sizeof(int));
 
 	float bg[3] = { white_bg ? 1.f : 0.f, white_bg ? 1.f : 0.f, white_bg ? 1.f : 0.f };
 	cudaMemcpy(background_cuda, bg, 3 * sizeof(float), cudaMemcpyHostToDevice);
@@ -354,6 +355,7 @@ void sibr::GaussianView::onRenderIBR(sibr::IRenderTarget & dst, const sibr::Came
 		cudaGraphicsResourceGetMappedPointer((void**)&image_cuda, &bytes, imageBufferCuda);
 
 		// Rasterize
+		int* rects = _fastCulling ? rect_cuda : nullptr;
 		CudaRasterizer::Rasterizer::forward(
 			geomBufferFunc,
 			binningBufferFunc,
@@ -375,7 +377,9 @@ void sibr::GaussianView::onRenderIBR(sibr::IRenderTarget & dst, const sibr::Came
 			tan_fovx,
 			tan_fovy,
 			false,
-			image_cuda
+			image_cuda,
+			nullptr,
+			rects
 		);
 
 		// Unmap OpenGL resource for use with OpenGL
@@ -410,6 +414,7 @@ void sibr::GaussianView::onGUI()
 	{
 		ImGui::SliderFloat("Scaling Modifier", &_scalingModifier, 0.001f, 1.0f);
 	}
+	ImGui::Checkbox("Fast culling", &_fastCulling);
 	ImGui::End();
 }
 
@@ -426,6 +431,7 @@ sibr::GaussianView::~GaussianView()
 	cudaFree(proj_cuda);
 	cudaFree(cam_pos_cuda);
 	cudaFree(background_cuda);
+	cudaFree(rect_cuda);
 
 	cudaGraphicsUnregisterResource(imageBufferCuda);
 	glDeleteBuffers(1, &imageBuffer);
diff --git a/src/projects/gaussianviewer/renderer/GaussianView.hpp b/src/projects/gaussianviewer/renderer/GaussianView.hpp
index 439fb916845febbbbe858a6c163e15ea5923de7b..b9e3777bff4b7699718fcacbd82f6e29878485e1 100644
--- a/src/projects/gaussianviewer/renderer/GaussianView.hpp
+++ b/src/projects/gaussianviewer/renderer/GaussianView.hpp
@@ -85,6 +85,7 @@ namespace sibr {
 
 		std::string currMode = "Splats";
 
+		bool _fastCulling = true;
 		int _device = 0;
 
 		int count;
@@ -93,6 +94,7 @@ namespace sibr {
 		float* scale_cuda;
 		float* opacity_cuda;
 		float* shs_cuda;
+		int* rect_cuda;
 
 		GLuint imageBuffer;
 		cudaGraphicsResource_t imageBufferCuda;