diff --git a/Rendering/WebGPU/CMakeLists.txt b/Rendering/WebGPU/CMakeLists.txt
index bfd3f9bebb2e0b9e7bec5d170ddbf20f46e8c1d9..258012a36f4ffdd76dc50dbf2bd5aba339ce5db0 100644
--- a/Rendering/WebGPU/CMakeLists.txt
+++ b/Rendering/WebGPU/CMakeLists.txt
@@ -9,7 +9,6 @@ set(classes
   vtkWebGPUBatchedPolyDataMapper
   vtkWebGPUCamera
   vtkWebGPUCellToPrimitiveConverter
-  vtkWebGPUClearDrawPass
   vtkWebGPUCommandEncoderDebugGroup
   vtkWebGPUCompositePolyDataMapperDelegator
   vtkWebGPUComputeBuffer
@@ -33,7 +32,6 @@ set(classes
   vtkWebGPUPolyDataMapper2D
   vtkWebGPUProperty
   vtkWebGPURenderer
-  vtkWebGPURenderPass
   vtkWebGPUShaderDatabase
   vtkWebGPUShaderProperty
   vtkWebGPUTexture
diff --git a/Rendering/WebGPU/vtkWebGPUCamera.cxx b/Rendering/WebGPU/vtkWebGPUCamera.cxx
index 3e52a238a4e40e38edab7f9c125b0f9bbed3573c..9878636ad24a5d991a9bd9829fa76327ec5b89e9 100644
--- a/Rendering/WebGPU/vtkWebGPUCamera.cxx
+++ b/Rendering/WebGPU/vtkWebGPUCamera.cxx
@@ -129,10 +129,6 @@ void vtkWebGPUCamera::UpdateViewport(vtkRenderer* renderer)
     rpassEncoder.SetScissorRect(
       lowerLeft[0], lowerLeft[1], static_cast<uint32_t>(width), static_cast<uint32_t>(height));
   }
-  if ((renderer->GetRenderWindow())->GetErase() && renderer->GetErase())
-  {
-    renderer->Clear();
-  }
 }
 
 //------------------------------------------------------------------------------
diff --git a/Rendering/WebGPU/vtkWebGPUClearDrawPass.cxx b/Rendering/WebGPU/vtkWebGPUClearDrawPass.cxx
deleted file mode 100644
index 7fac2cce1c94a450273ed30afddc4b5261f35216..0000000000000000000000000000000000000000
--- a/Rendering/WebGPU/vtkWebGPUClearDrawPass.cxx
+++ /dev/null
@@ -1,54 +0,0 @@
-// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
-// SPDX-License-Identifier: BSD-3-Clause
-
-#include "vtkWebGPUClearDrawPass.h"
-#include "Private/vtkWebGPURenderPassDescriptorInternals.h"
-#include "vtkObjectFactory.h"
-#include "vtkRenderState.h"
-#include "vtkRenderer.h"
-#include "vtkWebGPURenderWindow.h"
-
-VTK_ABI_NAMESPACE_BEGIN
-
-//------------------------------------------------------------------------------
-vtkStandardNewMacro(vtkWebGPUClearDrawPass);
-
-//------------------------------------------------------------------------------
-vtkWebGPUClearDrawPass::vtkWebGPUClearDrawPass() = default;
-
-//------------------------------------------------------------------------------
-vtkWebGPUClearDrawPass::~vtkWebGPUClearDrawPass() = default;
-
-//------------------------------------------------------------------------------
-void vtkWebGPUClearDrawPass::PrintSelf(ostream& os, vtkIndent indent)
-{
-  this->Superclass::PrintSelf(os, indent);
-}
-
-//------------------------------------------------------------------------------
-wgpu::RenderPassEncoder vtkWebGPUClearDrawPass::Begin(const vtkRenderState* state)
-{
-  auto wgpuRenderWindow =
-    vtkWebGPURenderWindow::SafeDownCast(state->GetRenderer()->GetRenderWindow());
-
-  std::vector<wgpu::TextureView> backBufferViews = {
-    wgpuRenderWindow->GetOffscreenColorAttachmentView()
-  };
-  wgpu::TextureView depthStencilView = wgpuRenderWindow->GetDepthStencilView();
-
-  vtkWebGPURenderPassDescriptorInternals renderPassDescriptor(
-    backBufferViews, depthStencilView, this->ClearColor, this->ClearDepth, this->ClearStencil);
-  renderPassDescriptor.label = "vtkWebGPUClearDrawPass::Begin";
-  return wgpuRenderWindow->NewRenderPass(renderPassDescriptor);
-}
-
-//------------------------------------------------------------------------------
-void vtkWebGPUClearDrawPass::Render(const vtkRenderState* state)
-{
-  if (!state->IsValid())
-  {
-    return;
-  }
-  this->End(state, this->Begin(state));
-}
-VTK_ABI_NAMESPACE_END
diff --git a/Rendering/WebGPU/vtkWebGPUClearDrawPass.h b/Rendering/WebGPU/vtkWebGPUClearDrawPass.h
deleted file mode 100644
index b205bd2919cd978c518811c515da81e4ab4b3b97..0000000000000000000000000000000000000000
--- a/Rendering/WebGPU/vtkWebGPUClearDrawPass.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
-// SPDX-License-Identifier: BSD-3-Clause
-#ifndef vtkWebGPUClearDrawPass_h
-#define vtkWebGPUClearDrawPass_h
-
-#include "vtkWebGPURenderPass.h"
-
-#include "vtkRenderingWebGPUModule.h" // for export macro
-
-VTK_ABI_NAMESPACE_BEGIN
-class VTKRENDERINGWEBGPU_EXPORT vtkWebGPUClearDrawPass : public vtkWebGPURenderPass
-{
-public:
-  static vtkWebGPUClearDrawPass* New();
-  vtkTypeMacro(vtkWebGPUClearDrawPass, vtkWebGPURenderPass);
-  void PrintSelf(ostream& os, vtkIndent indent) override;
-
-  void Render(const vtkRenderState* state) override;
-
-  ///@{
-  /**
-   * Get/set the ClearColor attribute. If true this clear pass will clear the color buffer
-   * before rendering. If false, this pass will render on top of the existing color buffer
-   */
-  vtkGetMacro(ClearColor, bool);
-  vtkSetMacro(ClearColor, bool);
-  ///@}
-
-  ///@{
-  /**
-   * Get/set the ClearDepth attribute. If true this clear pass will clear the depth buffer
-   * before rendering. If false, this pass will render on top of the existing depth buffer
-   */
-  vtkGetMacro(ClearDepth, bool);
-  vtkSetMacro(ClearDepth, bool);
-  ///@}
-
-  ///@{
-  /**
-   * Get/set the ClearStencil attribute. If true this clear pass will clear the stencil buffer
-   * before rendering. If false, this pass will render on top of the existing stencil buffer
-   */
-  vtkGetMacro(ClearStencil, bool);
-  vtkSetMacro(ClearStencil, bool);
-  ///@}
-
-  wgpu::RenderPassEncoder Begin(const vtkRenderState* state) override;
-
-protected:
-  vtkWebGPUClearDrawPass();
-  ~vtkWebGPUClearDrawPass() override;
-
-private:
-  bool ClearColor = true;
-  bool ClearDepth = true;
-  bool ClearStencil = true;
-
-  vtkWebGPUClearDrawPass(const vtkWebGPUClearDrawPass&) = delete;
-  void operator=(const vtkWebGPUClearDrawPass&) = delete;
-};
-
-VTK_ABI_NAMESPACE_END
-#endif
diff --git a/Rendering/WebGPU/vtkWebGPUHardwareSelector.h b/Rendering/WebGPU/vtkWebGPUHardwareSelector.h
index 6cd2f5fb6bd60c4f3a9eb9d62e3c9499f8aad458..076a0ff0925f9e389ec37906438ed6dbc539fce0 100644
--- a/Rendering/WebGPU/vtkWebGPUHardwareSelector.h
+++ b/Rendering/WebGPU/vtkWebGPUHardwareSelector.h
@@ -27,6 +27,13 @@ public:
   vtkTypeMacro(vtkWebGPUHardwareSelector, vtkHardwareSelector);
   void PrintSelf(ostream& os, vtkIndent indent) override;
 
+  /**
+   * The super class repeatedly renders the frame for different passes.
+   * We do not wish to do that as it is quite expensive. This class
+   * leverages webgpu features to achieve selection within a single pass.
+   */
+  bool CaptureBuffers() override{};
+
   /**
    * Called by the mapper before and after
    * rendering each prop.
diff --git a/Rendering/WebGPU/vtkWebGPURenderPass.cxx b/Rendering/WebGPU/vtkWebGPURenderPass.cxx
deleted file mode 100644
index 7e8464fe273442dd1a03ccc17c4735e2a4606e44..0000000000000000000000000000000000000000
--- a/Rendering/WebGPU/vtkWebGPURenderPass.cxx
+++ /dev/null
@@ -1,30 +0,0 @@
-// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
-// SPDX-License-Identifier: BSD-3-Clause
-#include "vtkWebGPURenderPass.h"
-#include "vtkRenderState.h"
-#include "vtkRenderer.h"
-#include "vtkWebGPURenderWindow.h"
-
-VTK_ABI_NAMESPACE_BEGIN
-//------------------------------------------------------------------------------
-vtkWebGPURenderPass::vtkWebGPURenderPass() = default;
-
-//------------------------------------------------------------------------------
-vtkWebGPURenderPass::~vtkWebGPURenderPass() = default;
-
-//------------------------------------------------------------------------------
-void vtkWebGPURenderPass::PrintSelf(ostream& os, vtkIndent indent)
-{
-  this->Superclass::PrintSelf(os, indent);
-}
-
-//------------------------------------------------------------------------------
-void vtkWebGPURenderPass::End(const vtkRenderState*, wgpu::RenderPassEncoder&& pass)
-{
-  pass.End();
-  pass = nullptr;
-}
-
-//------------------------------------------------------------------------------
-void vtkWebGPURenderPass::Render(const vtkRenderState*) {}
-VTK_ABI_NAMESPACE_END
diff --git a/Rendering/WebGPU/vtkWebGPURenderPass.h b/Rendering/WebGPU/vtkWebGPURenderPass.h
deleted file mode 100644
index 92e9f0b72557f27ea1546943f38c37e2191a344b..0000000000000000000000000000000000000000
--- a/Rendering/WebGPU/vtkWebGPURenderPass.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
-// SPDX-License-Identifier: BSD-3-Clause
-#ifndef vtkWebGPURenderPass_h
-#define vtkWebGPURenderPass_h
-
-#include "vtkRenderPass.h"
-
-#include "vtkRenderingWebGPUModule.h" // for export macro
-#include "vtk_wgpu.h"                 // for webgpu
-
-VTK_ABI_NAMESPACE_BEGIN
-class VTKRENDERINGWEBGPU_EXPORT vtkWebGPURenderPass : public vtkRenderPass
-{
-public:
-  vtkTypeMacro(vtkWebGPURenderPass, vtkRenderPass);
-  void PrintSelf(ostream& os, vtkIndent indent) override;
-
-  void Render(const vtkRenderState* state) override;
-
-  virtual wgpu::RenderPassEncoder Begin(const vtkRenderState* state) = 0;
-  virtual void End(const vtkRenderState* state, wgpu::RenderPassEncoder&& pass);
-
-protected:
-  vtkWebGPURenderPass();
-  ~vtkWebGPURenderPass() override;
-
-private:
-  vtkWebGPURenderPass(const vtkWebGPURenderPass&) = delete;
-  void operator=(const vtkWebGPURenderPass&) = delete;
-};
-
-VTK_ABI_NAMESPACE_END
-#endif
diff --git a/Rendering/WebGPU/vtkWebGPURenderWindow.cxx b/Rendering/WebGPU/vtkWebGPURenderWindow.cxx
index 6231915e968cde6b670ac70744254d8bc7c58536..5d1c1caec5585f17b6eb6a7c4b7027ba8fc980d0 100644
--- a/Rendering/WebGPU/vtkWebGPURenderWindow.cxx
+++ b/Rendering/WebGPU/vtkWebGPURenderWindow.cxx
@@ -19,7 +19,6 @@
 #include "vtkRendererCollection.h"
 #include "vtkTypeUInt8Array.h"
 #include "vtkUnsignedCharArray.h"
-#include "vtkWebGPUClearDrawPass.h"
 #include "vtkWebGPUConfiguration.h"
 #include "vtkWebGPURenderer.h"
 
diff --git a/Rendering/WebGPU/vtkWebGPURenderer.cxx b/Rendering/WebGPU/vtkWebGPURenderer.cxx
index 444caffafa99022d068e10dff02081e22b5d815a..d927ee2a3dec2da0504880abbc96b9a623171f77 100644
--- a/Rendering/WebGPU/vtkWebGPURenderer.cxx
+++ b/Rendering/WebGPU/vtkWebGPURenderer.cxx
@@ -4,6 +4,7 @@
 #include "Private/vtkWebGPUBindGroupInternals.h"
 #include "Private/vtkWebGPUBindGroupLayoutInternals.h"
 #include "Private/vtkWebGPUComputePassInternals.h"
+#include "Private/vtkWebGPURenderPassDescriptorInternals.h"
 #include "Private/vtkWebGPURenderPipelineDescriptorInternals.h"
 #include "vtkAbstractMapper.h"
 #include "vtkFrameBufferObjectBase.h"
@@ -15,10 +16,8 @@
 #include "vtkRenderState.h"
 #include "vtkRenderer.h"
 #include "vtkTransform.h"
-#include "vtkType.h"
 #include "vtkWebGPUActor.h"
 #include "vtkWebGPUCamera.h"
-#include "vtkWebGPUClearDrawPass.h"
 #include "vtkWebGPUComputePass.h"
 #include "vtkWebGPUComputeRenderBuffer.h"
 #include "vtkWebGPUConfiguration.h"
@@ -64,17 +63,6 @@ const char* backgroundShaderSource = R"(
       return output;
     }
   )";
-
-vtkWebGPURenderPass* MakeClearDrawPass()
-{
-  auto* pass = vtkWebGPUClearDrawPass::New();
-  // do not clear color because doing so would erase the contents of the entire
-  // color attachment, including other renderer's viewports!
-  pass->SetClearColor(false);
-  pass->SetClearDepth(false);
-  pass->SetClearStencil(false);
-  return pass;
-}
 }
 
 //------------------------------------------------------------------------------
@@ -178,7 +166,7 @@ void vtkWebGPURenderer::CreateBuffers()
 //------------------------------------------------------------------------------
 void vtkWebGPURenderer::Clear()
 {
-  if (!this->DoClearPass)
+  if (!this->DrawBackgroundInClearPass)
   {
     return;
   }
@@ -247,12 +235,44 @@ void vtkWebGPURenderer::DeviceRender()
   this->ConfigureComputePipelines();
   this->PreRenderComputePipelines();
 
-  this->BeginRecording(); // all pipelines execute in single render pass, for now.
-  this->ActiveCamera->UpdateViewport(this);
-  this->UpdateGeometry();
-  this->EndRecording();
+  this->RecordRenderCommands();
+
+  this->DrawBackgroundInClearPass = true;
+}
+
+//------------------------------------------------------------------------------
+void vtkWebGPURenderer::RecordRenderCommands()
+{
+  vtkRenderState state(this);
+  state.SetPropArrayAndCount(this->PropArray, this->PropArrayCount);
+  state.SetFrameBuffer(nullptr);
 
-  this->DoClearPass = true;
+  if (auto* wgpuRenderWindow = vtkWebGPURenderWindow::SafeDownCast(this->RenderWindow))
+  {
+    vtkWebGPURenderPassDescriptorInternals renderPassDescriptor(
+      { wgpuRenderWindow->GetOffscreenColorAttachmentView() },
+      wgpuRenderWindow->GetDepthStencilView(),
+      /*clearColor=*/false, /*clearDepth=*/false, /*clearStencil=*/false);
+    renderPassDescriptor.label = "vtkWebGPURenderer::RecordRenderCommands";
+    this->WGPURenderEncoder = wgpuRenderWindow->NewRenderPass(renderPassDescriptor);
+    this->BeginRecording();
+    // 1. Draw the background color/texture.
+    // updates viewport and scissor rectangles on the render pass encoder.
+    this->ActiveCamera->UpdateViewport(this);
+    // clear the viewport rectangle to background color.
+    if (this->RenderWindow->GetErase() && this->Erase)
+    {
+      this->Clear();
+    }
+    // 2. Now render all opaque and translucent props.
+    this->UpdateGeometry();
+    this->EndRecording();
+  }
+  else
+  {
+    vtkErrorMacro(
+      << "Cannot record render commands because RenderWindow is not a vtkWebGPURenderWindow!");
+  }
 }
 
 //------------------------------------------------------------------------------
@@ -288,7 +308,7 @@ int vtkWebGPURenderer::UpdateGeometry(vtkFrameBufferObjectBase* /*fbo=nullptr*/)
 {
   int i;
 
-  if (this->DoClearPass)
+  if (this->DrawBackgroundInClearPass)
   {
     this->PropsRendered.clear();
     this->NumberOfPropsRendered = 0;
@@ -771,10 +791,7 @@ wgpu::CommandBuffer vtkWebGPURenderer::EncodePropListRenderCommand(
   this->PropArray = propList;
   this->PropArrayCount = listLength;
 
-  this->BeginRecording();
-  this->ActiveCamera->UpdateViewport(this);
-  this->UpdateGeometry();
-  this->EndRecording();
+  this->RecordRenderCommands();
 
   // Restoring
   this->PropArray = propArrayBackup;
@@ -789,7 +806,7 @@ wgpu::CommandBuffer vtkWebGPURenderer::EncodePropListRenderCommand(
   // it's ready to be used again by someone else
   renderWindow->CreateCommandEncoder();
 
-  this->DoClearPass = false;
+  this->DrawBackgroundInClearPass = false;
   return commandBuffer;
 }
 
@@ -798,12 +815,8 @@ void vtkWebGPURenderer::BeginRecording()
 {
   vtkDebugMacro(<< __func__);
   this->RenderStage = RenderStageEnum::RecordingCommands;
-  vtkRenderState state(this);
-  state.SetPropArrayAndCount(this->PropArray, this->PropArrayCount);
-  state.SetFrameBuffer(nullptr);
-  this->Pass = ::MakeClearDrawPass();
+  assert(this->WGPURenderEncoder != nullptr);
 
-  this->WGPURenderEncoder = vtkWebGPURenderPass::SafeDownCast(this->Pass)->Begin(&state);
 #ifndef NDEBUG
   this->WGPURenderEncoder.PushDebugGroup("Renderer start encoding");
 #endif
@@ -895,8 +908,6 @@ void vtkWebGPURenderer::EndRecording()
 #endif
   this->WGPURenderEncoder.End();
   this->WGPURenderEncoder = nullptr;
-  this->Pass->Delete();
-  this->Pass = nullptr;
 }
 
 //------------------------------------------------------------------------------
diff --git a/Rendering/WebGPU/vtkWebGPURenderer.h b/Rendering/WebGPU/vtkWebGPURenderer.h
index 2db7d6730cffe2e175dfc1e406309b1e9165d7fd..4d78cb1ddfd4c2bcc6258fd7eb425fef1faff0b8 100644
--- a/Rendering/WebGPU/vtkWebGPURenderer.h
+++ b/Rendering/WebGPU/vtkWebGPURenderer.h
@@ -203,7 +203,7 @@ protected:
   // Create scene bind group.
   void SetupSceneBindGroup();
 
-  // Start, finish recording commands with render pass encoder
+  // Start, finish recording commands.
   void BeginRecording();
   void EndRecording();
 
@@ -310,6 +310,13 @@ private:
    */
   wgpu::CommandBuffer EncodePropListRenderCommand(vtkProp** propList, int listLength);
 
+  /**
+   * Records commands into a render pass encoder.
+   * This method records commands which draw the background texture/clear color
+   * and commands which render all the props contained in this renderer.
+   */
+  void RecordRenderCommands();
+
   /**
    * Whether the compute render buffers of the mappers of the actors of this renderer have already
    * been initialized or not
@@ -325,7 +332,7 @@ private:
   /**
    * Whether to clear the depth/stencil/color buffer before rendering
    */
-  bool DoClearPass = true;
+  bool DrawBackgroundInClearPass = true;
 
   /**
    * List of the actors rendered last frame. Mainly used by the occlusion culler when we want to