From 4dcea08b904a54724cec52631b871df050b91cfc Mon Sep 17 00:00:00 2001 From: Kelsi Date: Mon, 6 Apr 2026 18:27:52 -0700 Subject: [PATCH] Revert "fix(rendering): enable backface culling for one-sided M2 materials (#57)" This reverts commit 7b746a30456a7d591ae2a1220a01b9339a15ec1e. --- include/rendering/m2_renderer.hpp | 7 +------ src/rendering/m2_renderer.cpp | 26 +++++--------------------- src/rendering/m2_renderer_render.cpp | 25 ++++--------------------- 3 files changed, 10 insertions(+), 48 deletions(-) diff --git a/include/rendering/m2_renderer.hpp b/include/rendering/m2_renderer.hpp index 97c4fde8..5db00014 100644 --- a/include/rendering/m2_renderer.hpp +++ b/include/rendering/m2_renderer.hpp @@ -394,16 +394,11 @@ private: // Vulkan context VkContext* vkCtx_ = nullptr; - // Vulkan pipelines — two-sided (VK_CULL_MODE_NONE) variants + // Vulkan pipelines (one per blend mode) VkPipeline opaquePipeline_ = VK_NULL_HANDLE; // blend mode 0 VkPipeline alphaTestPipeline_ = VK_NULL_HANDLE; // blend mode 1 VkPipeline alphaPipeline_ = VK_NULL_HANDLE; // blend mode 2 VkPipeline additivePipeline_ = VK_NULL_HANDLE; // blend mode 3+ - // Backface-culled variants for one-sided materials (materialFlags & 0x04 == 0) - VkPipeline opaqueCulledPipeline_ = VK_NULL_HANDLE; - VkPipeline alphaTestCulledPipeline_ = VK_NULL_HANDLE; - VkPipeline alphaCulledPipeline_ = VK_NULL_HANDLE; - VkPipeline additiveCulledPipeline_ = VK_NULL_HANDLE; VkPipelineLayout pipelineLayout_ = VK_NULL_HANDLE; // Shadow rendering (Phase 7) diff --git a/src/rendering/m2_renderer.cpp b/src/rendering/m2_renderer.cpp index 2351fa63..5281aad6 100644 --- a/src/rendering/m2_renderer.cpp +++ b/src/rendering/m2_renderer.cpp @@ -570,14 +570,13 @@ bool M2Renderer::initialize(VkContext* ctx, VkDescriptorSetLayout perFrameLayout // Pipeline derivatives — opaque is the base, others derive from it for shared state optimization auto buildM2Pipeline = [&](VkPipelineColorBlendAttachmentState blendState, bool depthWrite, - VkCullModeFlags cullMode = VK_CULL_MODE_NONE, VkPipelineCreateFlags flags = 0, VkPipeline basePipeline = VK_NULL_HANDLE) -> VkPipeline { return PipelineBuilder() .setShaders(m2Vert.stageInfo(VK_SHADER_STAGE_VERTEX_BIT), m2Frag.stageInfo(VK_SHADER_STAGE_FRAGMENT_BIT)) .setVertexInput({m2Binding}, m2Attrs) .setTopology(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST) - .setRasterization(VK_POLYGON_MODE_FILL, cullMode) + .setRasterization(VK_POLYGON_MODE_FILL, VK_CULL_MODE_NONE) .setDepthTest(true, depthWrite, VK_COMPARE_OP_LESS_OR_EQUAL) .setColorBlendAttachment(blendState) .setMultisample(vkCtx_->getMsaaSamples()) @@ -589,26 +588,15 @@ bool M2Renderer::initialize(VkContext* ctx, VkDescriptorSetLayout perFrameLayout .build(device, vkCtx_->getPipelineCache()); }; - // Two-sided pipelines (VK_CULL_MODE_NONE) — for materials with TwoSided flag (0x04) - opaquePipeline_ = buildM2Pipeline(PipelineBuilder::blendDisabled(), true, VK_CULL_MODE_NONE, + opaquePipeline_ = buildM2Pipeline(PipelineBuilder::blendDisabled(), true, VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT); - alphaTestPipeline_ = buildM2Pipeline(PipelineBuilder::blendAlpha(), true, VK_CULL_MODE_NONE, + alphaTestPipeline_ = buildM2Pipeline(PipelineBuilder::blendAlpha(), true, VK_PIPELINE_CREATE_DERIVATIVE_BIT, opaquePipeline_); - alphaPipeline_ = buildM2Pipeline(PipelineBuilder::blendAlpha(), false, VK_CULL_MODE_NONE, + alphaPipeline_ = buildM2Pipeline(PipelineBuilder::blendAlpha(), false, VK_PIPELINE_CREATE_DERIVATIVE_BIT, opaquePipeline_); - additivePipeline_ = buildM2Pipeline(PipelineBuilder::blendAdditive(), false, VK_CULL_MODE_NONE, + additivePipeline_ = buildM2Pipeline(PipelineBuilder::blendAdditive(), false, VK_PIPELINE_CREATE_DERIVATIVE_BIT, opaquePipeline_); - // Backface-culled pipelines — default for one-sided materials - opaqueCulledPipeline_ = buildM2Pipeline(PipelineBuilder::blendDisabled(), true, VK_CULL_MODE_BACK_BIT, - VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT); - alphaTestCulledPipeline_ = buildM2Pipeline(PipelineBuilder::blendAlpha(), true, VK_CULL_MODE_BACK_BIT, - VK_PIPELINE_CREATE_DERIVATIVE_BIT, opaqueCulledPipeline_); - alphaCulledPipeline_ = buildM2Pipeline(PipelineBuilder::blendAlpha(), false, VK_CULL_MODE_BACK_BIT, - VK_PIPELINE_CREATE_DERIVATIVE_BIT, opaqueCulledPipeline_); - additiveCulledPipeline_ = buildM2Pipeline(PipelineBuilder::blendAdditive(), false, VK_CULL_MODE_BACK_BIT, - VK_PIPELINE_CREATE_DERIVATIVE_BIT, opaqueCulledPipeline_); - // --- Build particle pipelines --- if (particleVert.isValid() && particleFrag.isValid()) { VkVertexInputBindingDescription pBind{}; @@ -873,10 +861,6 @@ void M2Renderer::shutdown() { destroyPipeline(alphaTestPipeline_); destroyPipeline(alphaPipeline_); destroyPipeline(additivePipeline_); - destroyPipeline(opaqueCulledPipeline_); - destroyPipeline(alphaTestCulledPipeline_); - destroyPipeline(alphaCulledPipeline_); - destroyPipeline(additiveCulledPipeline_); destroyPipeline(particlePipeline_); destroyPipeline(particleAdditivePipeline_); destroyPipeline(smokePipeline_); diff --git a/src/rendering/m2_renderer_render.cpp b/src/rendering/m2_renderer_render.cpp index 58a0a458..d013fb50 100644 --- a/src/rendering/m2_renderer_render.cpp +++ b/src/rendering/m2_renderer_render.cpp @@ -1147,25 +1147,16 @@ void M2Renderer::render(VkCommandBuffer cmd, VkDescriptorSet perFrameSet, const } if (forceCutout) effectiveBlendMode = 1; - const bool twoSided = (batch.materialFlags & 0x04) != 0; VkPipeline desiredPipeline; if (forceCutout) { - // Foliage / ground-detail cards are effectively two-sided desiredPipeline = opaquePipeline_; - } else if (twoSided) { + } else { switch (effectiveBlendMode) { case 0: desiredPipeline = opaquePipeline_; break; case 1: desiredPipeline = alphaTestPipeline_; break; case 2: desiredPipeline = alphaPipeline_; break; default: desiredPipeline = additivePipeline_; break; } - } else { - switch (effectiveBlendMode) { - case 0: desiredPipeline = opaqueCulledPipeline_; break; - case 1: desiredPipeline = alphaTestCulledPipeline_; break; - case 2: desiredPipeline = alphaCulledPipeline_; break; - default: desiredPipeline = additiveCulledPipeline_; break; - } } if (desiredPipeline != currentPipeline) { vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, desiredPipeline); @@ -1357,18 +1348,10 @@ void M2Renderer::render(VkCommandBuffer cmd, VkDescriptorSet perFrameSet, const else if (effectiveBlendMode == 4 || effectiveBlendMode == 5) effectiveBlendMode = 3; } - const bool twoSided = (batch.materialFlags & 0x04) != 0; VkPipeline desiredPipeline; - if (twoSided) { - switch (effectiveBlendMode) { - case 2: desiredPipeline = alphaPipeline_; break; - default: desiredPipeline = additivePipeline_; break; - } - } else { - switch (effectiveBlendMode) { - case 2: desiredPipeline = alphaCulledPipeline_; break; - default: desiredPipeline = additiveCulledPipeline_; break; - } + switch (effectiveBlendMode) { + case 2: desiredPipeline = alphaPipeline_; break; + default: desiredPipeline = additivePipeline_; break; } if (desiredPipeline != currentPipeline) { vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, desiredPipeline);