diff --git a/Rendering/WebGPU/Private/vtkWebGPUActorInternals.h b/Rendering/WebGPU/Private/vtkWebGPUActorInternals.h
index 3a0a7e3155cda49fc455b77a8cb9503d67baed8b..f3f5c1dd41a1da8f078c34557361d580eebe06aa 100644
--- a/Rendering/WebGPU/Private/vtkWebGPUActorInternals.h
+++ b/Rendering/WebGPU/Private/vtkWebGPUActorInternals.h
@@ -71,6 +71,7 @@ public:
       // Interpolation type
       vtkTypeUInt32 InterpolationType = VTK_FLAT;
     } ShadeOpts;
+    vtkTypeUInt32 Id = 0;
   };
 
   class MapperBooleanCache
@@ -116,6 +117,8 @@ public:
   wgpu::BindGroup ActorBindGroup;
   wgpu::Buffer ActorBuffer;
 
+  vtkTypeUInt32 Id = 0;
+
   inline void PopulateBindgroupLayouts(std::vector<wgpu::BindGroupLayout>& layouts)
   {
     layouts.emplace_back(this->ActorBindGroupLayout);
diff --git a/Rendering/WebGPU/vtkWebGPUActor.cxx b/Rendering/WebGPU/vtkWebGPUActor.cxx
index d0cf936902ccf942e7e61adfad19de4e1ce89bfc..945b7a934034789ce46eb2d98b246c86ffa46566 100644
--- a/Rendering/WebGPU/vtkWebGPUActor.cxx
+++ b/Rendering/WebGPU/vtkWebGPUActor.cxx
@@ -109,6 +109,7 @@ void vtkWebGPUActor::Render(vtkRenderer* renderer, vtkMapper* mapper)
         bool updateBuffers = this->CacheActorRenderOptions();
         updateBuffers |= this->CacheActorShadeOptions();
         updateBuffers |= this->CacheActorTransforms();
+        updateBuffers |= this->CacheActorId();
         if (updateBuffers)
         {
           wgpuConfiguration->WriteBuffer(internals.ActorBuffer, 0,
@@ -158,6 +159,12 @@ bool vtkWebGPUActor::SupportRenderBundles()
   return true;
 }
 
+//------------------------------------------------------------------------------
+void vtkWebGPUActor::SetId(vtkTypeUInt32 id)
+{
+  this->Internals->Id = id;
+}
+
 //------------------------------------------------------------------------------
 vtkTypeBool vtkWebGPUActor::HasOpaqueGeometry()
 {
@@ -350,6 +357,18 @@ bool vtkWebGPUActor::CacheActorShadeOptions()
   return false;
 }
 
+//------------------------------------------------------------------------------
+bool vtkWebGPUActor::CacheActorId()
+{
+  auto& internals = (*this->Internals);
+  if (internals.CachedActorInfo.Id != internals.Id)
+  {
+    internals.CachedActorInfo.Id = internals.Id;
+    return true;
+  }
+  return false;
+}
+
 //------------------------------------------------------------------------------
 void vtkWebGPUActor::AllocateResources(vtkWebGPUConfiguration* wgpuConfiguration)
 {
diff --git a/Rendering/WebGPU/vtkWebGPUActor.h b/Rendering/WebGPU/vtkWebGPUActor.h
index 0e30e0b732148c15e243ee03f0d1ce858e9d3d07..397e3e1a573dea5c8fc37a7bda4958bf8b40f0cd 100644
--- a/Rendering/WebGPU/vtkWebGPUActor.h
+++ b/Rendering/WebGPU/vtkWebGPUActor.h
@@ -72,6 +72,7 @@ private:
    * pipeline for the rendering and thus doesn't support render bundles.
    */
   bool SupportRenderBundles();
+  void SetId(vtkTypeUInt32 id);
 
   bool UpdateKeyMatrices();
 
@@ -81,6 +82,7 @@ private:
   bool CacheActorTransforms();
   bool CacheActorRenderOptions();
   bool CacheActorShadeOptions();
+  bool CacheActorId();
 
   void AllocateResources(vtkWebGPUConfiguration* renderer);
 };
diff --git a/Rendering/WebGPU/vtkWebGPURenderer.cxx b/Rendering/WebGPU/vtkWebGPURenderer.cxx
index a5b5d0e8de3698f7c2ecba1ef73c71cfe253c7f1..60e6b369cb83cb623c147c3c88b912a2e7678625 100644
--- a/Rendering/WebGPU/vtkWebGPURenderer.cxx
+++ b/Rendering/WebGPU/vtkWebGPURenderer.cxx
@@ -416,6 +416,10 @@ int vtkWebGPURenderer::UpdateOpaquePolygonalGeometry()
     {
       for (int i = 0; i < this->PropArrayCount; i++)
       {
+        if (auto* wgpuActor = vtkWebGPUActor::SafeDownCast(this->PropArray[i]))
+        {
+          wgpuActor->SetId(i);
+        }
         this->PropArray[i]->RenderOpaqueGeometry(this);
       }
       result += this->PropArrayCount;
@@ -452,6 +456,10 @@ int vtkWebGPURenderer::UpdateTranslucentPolygonalGeometry()
     {
       for (int i = 0; i < this->PropArrayCount; i++)
       {
+        if (auto* wgpuActor = vtkWebGPUActor::SafeDownCast(this->PropArray[i]))
+        {
+          wgpuActor->SetId(i);
+        }
         this->PropArray[i]->RenderTranslucentPolygonalGeometry(this);
       }
       result += this->PropArrayCount;
diff --git a/Rendering/WebGPU/wgsl/LineGlyphShader.wgsl b/Rendering/WebGPU/wgsl/LineGlyphShader.wgsl
index 82134cf3d2669f85e693b9a896de94b1ef9ef640..4e73968cc11de7d9f2dc2e1e18584d75afdb8e71 100644
--- a/Rendering/WebGPU/wgsl/LineGlyphShader.wgsl
+++ b/Rendering/WebGPU/wgsl/LineGlyphShader.wgsl
@@ -33,7 +33,8 @@ const TRIANGLE_VERTS = array(
 struct ActorBlock {
   transform: ActorTransform,
   render_options: ActorRenderOptions,
-  color_options: ActorColorOptions
+  color_options: ActorColorOptions,
+  id: u32,
 }
 
 //-------------------------------------------------------------------
diff --git a/Rendering/WebGPU/wgsl/LineMiterJoinVertexShader.wgsl b/Rendering/WebGPU/wgsl/LineMiterJoinVertexShader.wgsl
index f29e73cbe1a271bad78142c7c393300d51f21cd5..2e17120cad89d21dda5280d151cc55e9413b8a65 100644
--- a/Rendering/WebGPU/wgsl/LineMiterJoinVertexShader.wgsl
+++ b/Rendering/WebGPU/wgsl/LineMiterJoinVertexShader.wgsl
@@ -28,7 +28,8 @@ const TRIANGLE_VERTS = array(
 struct ActorBlock {
   transform: ActorTransform,
   render_options: ActorRenderOptions,
-  color_options: ActorColorOptions
+  color_options: ActorColorOptions,
+  id: u32,
 }
 
 //-------------------------------------------------------------------
diff --git a/Rendering/WebGPU/wgsl/LineRoundJoinVertexShader.wgsl b/Rendering/WebGPU/wgsl/LineRoundJoinVertexShader.wgsl
index a0773d1693f1354fa46b944c389224b9aa829d06..98da5789efbec6b8dc1aea6bd340bf8c829c5970 100644
--- a/Rendering/WebGPU/wgsl/LineRoundJoinVertexShader.wgsl
+++ b/Rendering/WebGPU/wgsl/LineRoundJoinVertexShader.wgsl
@@ -81,7 +81,8 @@ const TRIANGLE_VERTS = array(
 struct ActorBlock {
   transform: ActorTransform,
   render_options: ActorRenderOptions,
-  color_options: ActorColorOptions
+  color_options: ActorColorOptions,
+  id: u32,
 }
 
 //-------------------------------------------------------------------
diff --git a/Rendering/WebGPU/wgsl/PointGlyphShader.wgsl b/Rendering/WebGPU/wgsl/PointGlyphShader.wgsl
index fdee632b2356ed2df35832556a72ec4902f0669c..8e8ef01cd31e572369a5883377a9487cd2827cfe 100644
--- a/Rendering/WebGPU/wgsl/PointGlyphShader.wgsl
+++ b/Rendering/WebGPU/wgsl/PointGlyphShader.wgsl
@@ -34,7 +34,8 @@ const TRIANGLE_VERTS = array(
 struct ActorBlock {
   transform: ActorTransform,
   render_options: ActorRenderOptions,
-  color_options: ActorColorOptions
+  color_options: ActorColorOptions,
+  id: u32,
 }
 
 //-------------------------------------------------------------------
diff --git a/Rendering/WebGPU/wgsl/PointShader.wgsl b/Rendering/WebGPU/wgsl/PointShader.wgsl
index 45c9da664fd70590ecbf92e832636d6fa9e64990..768d917cdb384869579bcf6ea13737e993a3146e 100644
--- a/Rendering/WebGPU/wgsl/PointShader.wgsl
+++ b/Rendering/WebGPU/wgsl/PointShader.wgsl
@@ -32,7 +32,8 @@ const TRIANGLE_VERTS = array(
 struct ActorBlock {
   transform: ActorTransform,
   render_options: ActorRenderOptions,
-  color_options: ActorColorOptions
+  color_options: ActorColorOptions,
+  id: u32,
 }
 
 //-------------------------------------------------------------------
diff --git a/Rendering/WebGPU/wgsl/SurfaceMeshGlyphShader.wgsl b/Rendering/WebGPU/wgsl/SurfaceMeshGlyphShader.wgsl
index b3a759b48d3f147a3df0b29cc23b90d3eab56454..3e30902d864cfda3cf19419d839241b62ac1438e 100644
--- a/Rendering/WebGPU/wgsl/SurfaceMeshGlyphShader.wgsl
+++ b/Rendering/WebGPU/wgsl/SurfaceMeshGlyphShader.wgsl
@@ -14,7 +14,8 @@
 struct ActorBlock {
   transform: ActorTransform,
   render_options: ActorRenderOptions,
-  color_options: ActorColorOptions
+  color_options: ActorColorOptions,
+  id: u32,
 }
 
 //-------------------------------------------------------------------
diff --git a/Rendering/WebGPU/wgsl/SurfaceMeshShader.wgsl b/Rendering/WebGPU/wgsl/SurfaceMeshShader.wgsl
index fc4c0ebb1d7939ceb816da8c78cb79834e85437d..2ec283b0b11496fdcb68c19e00ad656659427548 100644
--- a/Rendering/WebGPU/wgsl/SurfaceMeshShader.wgsl
+++ b/Rendering/WebGPU/wgsl/SurfaceMeshShader.wgsl
@@ -13,7 +13,8 @@
 struct ActorBlock {
   transform: ActorTransform,
   render_options: ActorRenderOptions,
-  color_options: ActorColorOptions
+  color_options: ActorColorOptions,
+  id: u32,
 }
 
 //-------------------------------------------------------------------