Revert "fix(rendering): enable backface culling for one-sided M2 materials (#57)"

This reverts commit 7b746a3045.
This commit is contained in:
Kelsi 2026-04-06 18:27:52 -07:00
parent 70a0be9e79
commit 4dcea08b90
3 changed files with 10 additions and 48 deletions

View file

@ -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)

View file

@ -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_);

View file

@ -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);