diff --git a/lib/bsp_loader/src/bsp.rs b/lib/bsp_loader/src/bsp.rs
index e8cfbdd..6c4897e 100644
--- a/lib/bsp_loader/src/bsp.rs
+++ b/lib/bsp_loader/src/bsp.rs
@@ -72,7 +72,7 @@ pub fn convert<'a>(
 
 		let color=mb.acquire_color_id(glam::Vec4::ONE);
 		let mut graphics_groups=Vec::new();
-		let mut physics_group=model::IndexedPhysicsGroup::default();
+		let mut render_id_to_graphics_group_id=std::collections::HashMap::new();
 		let polygon_groups=world_model.faces().enumerate().map(|(polygon_group_id,face)|{
 			let polygon_group_id=model::PolygonGroupId::new(polygon_group_id as u32);
 			let face_texture=face.texture();
@@ -81,10 +81,6 @@ pub fn convert<'a>(
 			let texture_transform_u=glam::Vec4::from_array(face_texture.texture_transforms_u)/(face_texture_data.width as f32);
 			let texture_transform_v=glam::Vec4::from_array(face_texture.texture_transforms_v)/(face_texture_data.height as f32);
 
-			//this automatically figures out what the texture is trying to do and creates
-			//a render config for it, and then returns the id to that render config
-			let render_id=render_config_deferred_loader.acquire_render_config_id(Some(Cow::Borrowed(face_texture_data.name())));
-
 			//normal
 			let normal=mb.acquire_normal_id(valve_transform(face.normal().into()));
 			let mut polygon_iter=face.vertex_positions().map(|vertex_position|
@@ -102,11 +98,19 @@ pub fn convert<'a>(
 				).to_vec()
 			}).collect();
 			if face.is_visible(){
-				//TODO: deduplicate graphics groups by render id
-				graphics_groups.push(model::IndexedGraphicsGroup{
-					render:render_id,
-					groups:vec![polygon_group_id],
-				})
+				//this automatically figures out what the texture is trying to do and creates
+				//a render config for it, and then returns the id to that render config
+				let render_id=render_config_deferred_loader.acquire_render_config_id(Some(Cow::Borrowed(face_texture_data.name())));
+				//deduplicate graphics groups by render id
+				let graphics_group_id=*render_id_to_graphics_group_id.entry(render_id).or_insert_with(||{
+					let graphics_group_id=graphics_groups.len();
+					graphics_groups.push(model::IndexedGraphicsGroup{
+						render:render_id,
+						groups:vec![],
+					});
+					graphics_group_id
+				});
+				graphics_groups[graphics_group_id].groups.push(polygon_group_id);
 			}
 			model::PolygonGroup::PolygonList(model::PolygonList::new(polygon_list))
 		}).collect();