diff --git a/Rendering/WebGPU/Private/vtkWebGPUPolyDataMapper2DInternals.cxx b/Rendering/WebGPU/Private/vtkWebGPUPolyDataMapper2DInternals.cxx index 744332c60c04863e701cbf95af5ca446f0595e52..02cce8e7de5f5a1b8035de009c3c79270159034c 100644 --- a/Rendering/WebGPU/Private/vtkWebGPUPolyDataMapper2DInternals.cxx +++ b/Rendering/WebGPU/Private/vtkWebGPUPolyDataMapper2DInternals.cxx @@ -463,6 +463,7 @@ void vtkWebGPUPolyDataMapper2DInternals::UpdateBuffers( vtkWebGPURenderPipelineDescriptorInternals descriptor; descriptor.vertex.bufferCount = 0; descriptor.cFragment.entryPoint = "fragmentMain"; + descriptor.EnableBlending(0); descriptor.cTargets[0].format = wgpuRenderWindow->GetPreferredSurfaceTextureFormat(); ///@{ TODO: Only for valid depth stencil formats auto depthState = descriptor.EnableDepthStencil(wgpuRenderWindow->GetDepthStencilFormat()); diff --git a/Rendering/WebGPU/Private/vtkWebGPURenderPipelineDescriptorInternals.cxx b/Rendering/WebGPU/Private/vtkWebGPURenderPipelineDescriptorInternals.cxx index 10f535e0acba6e5fc08841a89779803faa650575..338d2feae9f57b63dec75bb8e289918586d82e56 100644 --- a/Rendering/WebGPU/Private/vtkWebGPURenderPipelineDescriptorInternals.cxx +++ b/Rendering/WebGPU/Private/vtkWebGPURenderPipelineDescriptorInternals.cxx @@ -91,7 +91,6 @@ vtkWebGPURenderPipelineDescriptorInternals::vtkWebGPURenderPipelineDescriptorInt for (uint32_t i = 0; i < kMaxColorAttachments; ++i) { cTargets[i].format = wgpu::TextureFormat::RGBA8Unorm; - cTargets[i].blend = &cBlends[i]; cTargets[i].writeMask = wgpu::ColorWriteMask::All; cBlends[i].color = blendComponent; @@ -114,4 +113,17 @@ void vtkWebGPURenderPipelineDescriptorInternals::DisableDepthStencil() { this->depthStencil = nullptr; } + +wgpu::BlendState* vtkWebGPURenderPipelineDescriptorInternals::EnableBlending( + std::size_t colorTargetId) +{ + this->cTargets[colorTargetId].blend = &cBlends[colorTargetId]; + return &cBlends[colorTargetId]; +} + +void vtkWebGPURenderPipelineDescriptorInternals::DisableBlending(std::size_t colorTargetId) +{ + this->cTargets[colorTargetId].blend = nullptr; +} + VTK_ABI_NAMESPACE_END diff --git a/Rendering/WebGPU/Private/vtkWebGPURenderPipelineDescriptorInternals.h b/Rendering/WebGPU/Private/vtkWebGPURenderPipelineDescriptorInternals.h index 436a5aa73be60634a84c5a2d7430de4a69955aff..6f2b0449105a6f63575c4a6d2b0c3ca1b7e6852b 100644 --- a/Rendering/WebGPU/Private/vtkWebGPURenderPipelineDescriptorInternals.h +++ b/Rendering/WebGPU/Private/vtkWebGPURenderPipelineDescriptorInternals.h @@ -31,6 +31,9 @@ public: wgpu::TextureFormat format = wgpu::TextureFormat::Depth24PlusStencil8); void DisableDepthStencil(); + wgpu::BlendState* EnableBlending(std::size_t colorTargetId); + void DisableBlending(std::size_t colorTargetId); + std::array<wgpu::VertexBufferLayout, kMaxVertexBuffers> cBuffers; std::array<wgpu::VertexAttribute, kMaxVertexAttributes> cAttributes; std::array<wgpu::ColorTargetState, kMaxColorAttachments> cTargets; diff --git a/Rendering/WebGPU/vtkWebGPUGlyph3DMapper.cxx b/Rendering/WebGPU/vtkWebGPUGlyph3DMapper.cxx index 485d8ea8d912e126218c6cd9196a025ba36eccef..8a9c092e3c9280e9f1c487e44d264489f93307be 100644 --- a/Rendering/WebGPU/vtkWebGPUGlyph3DMapper.cxx +++ b/Rendering/WebGPU/vtkWebGPUGlyph3DMapper.cxx @@ -1126,6 +1126,7 @@ public: descriptor.vertex.entryPoint = "vertexMain"; descriptor.vertex.bufferCount = 0; descriptor.cFragment.entryPoint = "fragmentMain"; + descriptor.EnableBlending(0); descriptor.cTargets[0].format = wgpuRenderWindow->GetPreferredSurfaceTextureFormat(); auto depthState = descriptor.EnableDepthStencil(wgpuRenderWindow->GetDepthStencilFormat()); depthState->depthWriteEnabled = true; diff --git a/Rendering/WebGPU/vtkWebGPUPolyDataMapper.cxx b/Rendering/WebGPU/vtkWebGPUPolyDataMapper.cxx index 8b6ed22c90713064735fc0c4384471d8375b1461..0c6ae49ec7fb01d7ca7c0f523d00d19be29376ea 100644 --- a/Rendering/WebGPU/vtkWebGPUPolyDataMapper.cxx +++ b/Rendering/WebGPU/vtkWebGPUPolyDataMapper.cxx @@ -1309,6 +1309,7 @@ void vtkWebGPUPolyDataMapper::SetupGraphicsPipelines( descriptor.vertex.entryPoint = "vertexMain"; descriptor.vertex.bufferCount = 0; descriptor.cFragment.entryPoint = "fragmentMain"; + descriptor.EnableBlending(0); descriptor.cTargets[0].format = wgpuRenderWindow->GetPreferredSurfaceTextureFormat(); ///@{ TODO: Only for valid depth stencil formats auto depthState = descriptor.EnableDepthStencil(wgpuRenderWindow->GetDepthStencilFormat()); diff --git a/Rendering/WebGPU/vtkWebGPURenderer.cxx b/Rendering/WebGPU/vtkWebGPURenderer.cxx index 75777e2d12672e3337558c508ca6e86ecfa5212f..444caffafa99022d068e10dff02081e22b5d815a 100644 --- a/Rendering/WebGPU/vtkWebGPURenderer.cxx +++ b/Rendering/WebGPU/vtkWebGPURenderer.cxx @@ -203,19 +203,20 @@ void vtkWebGPURenderer::Clear() for (int i = 0; i < vtkWebGPURenderPipelineDescriptorInternals::kMaxColorAttachments; ++i) { + auto* blendState = bkgPipelineDescriptor.EnableBlending(i); if (this->Transparent()) { - bkgPipelineDescriptor.cBlends[i].color.srcFactor = wgpu::BlendFactor::Zero; - bkgPipelineDescriptor.cBlends[i].color.dstFactor = wgpu::BlendFactor::One; - bkgPipelineDescriptor.cBlends[i].alpha.srcFactor = wgpu::BlendFactor::Zero; - bkgPipelineDescriptor.cBlends[i].alpha.dstFactor = wgpu::BlendFactor::One; + blendState->color.srcFactor = wgpu::BlendFactor::Zero; + blendState->color.dstFactor = wgpu::BlendFactor::One; + blendState->alpha.srcFactor = wgpu::BlendFactor::Zero; + blendState->alpha.dstFactor = wgpu::BlendFactor::One; } else { - bkgPipelineDescriptor.cBlends[i].color.srcFactor = wgpu::BlendFactor::Constant; - bkgPipelineDescriptor.cBlends[i].color.dstFactor = wgpu::BlendFactor::Zero; - bkgPipelineDescriptor.cBlends[i].alpha.srcFactor = wgpu::BlendFactor::Constant; - bkgPipelineDescriptor.cBlends[i].alpha.dstFactor = wgpu::BlendFactor::Zero; + blendState->color.srcFactor = wgpu::BlendFactor::Constant; + blendState->color.dstFactor = wgpu::BlendFactor::Zero; + blendState->alpha.srcFactor = wgpu::BlendFactor::Constant; + blendState->alpha.dstFactor = wgpu::BlendFactor::Zero; } } const auto pipelineKey =