mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-05-08 10:03:51 +00:00
fix(rendering): enable backface culling for one-sided M2 materials (#57)
All M2 pipelines used VK_CULL_MODE_NONE, so back-facing polygons always rendered. On NPCs whose torso meshes are single-layer geometry this made the interior cavity visible through the back. Create backface-culled pipeline variants (VK_CULL_MODE_BACK_BIT) and select them at draw time unless the material has the TwoSided flag (0x04). Foliage/ground-detail forceCutout batches and the shadow pipeline keep VK_CULL_MODE_NONE since those cards are inherently two-sided.
This commit is contained in:
parent
f79110cb14
commit
7b746a3045
3 changed files with 48 additions and 10 deletions
|
|
@ -1147,16 +1147,25 @@ 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 {
|
||||
} else if (twoSided) {
|
||||
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);
|
||||
|
|
@ -1348,10 +1357,18 @@ 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;
|
||||
switch (effectiveBlendMode) {
|
||||
case 2: desiredPipeline = alphaPipeline_; break;
|
||||
default: desiredPipeline = additivePipeline_; break;
|
||||
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;
|
||||
}
|
||||
}
|
||||
if (desiredPipeline != currentPipeline) {
|
||||
vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, desiredPipeline);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue