mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-03-23 07:40:14 +00:00
Add configurable MSAA anti-aliasing, update auth screen and terrain shader
- MSAA: conditional 2-att (off) vs 3-att (on) render pass with auto-resolve - MSAA: multisampled color+depth images, query max supported sample count - MSAA: .setMultisample() on all 25+ main-pass pipelines across 17 renderers - MSAA: recreatePipelines() on every sub-renderer for runtime MSAA changes - MSAA: Renderer::setMsaaSamples() orchestrates swapchain+pipeline+ImGui rebuild - MSAA: Anti-Aliasing combo (Off/2x/4x/8x) in Video settings, persisted - Update auth screen assets and terrain fragment shader
This commit is contained in:
parent
6d213ad49b
commit
e12141a673
54 changed files with 2069 additions and 144 deletions
|
|
@ -723,6 +723,66 @@ void Renderer::shutdown() {
|
|||
LOG_INFO("Renderer shutdown");
|
||||
}
|
||||
|
||||
void Renderer::setMsaaSamples(VkSampleCountFlagBits samples) {
|
||||
if (!vkCtx) return;
|
||||
|
||||
VkSampleCountFlagBits current = vkCtx->getMsaaSamples();
|
||||
if (samples == current) return;
|
||||
|
||||
LOG_INFO("Changing MSAA from ", static_cast<int>(current), "x to ", static_cast<int>(samples), "x");
|
||||
|
||||
vkDeviceWaitIdle(vkCtx->getDevice());
|
||||
|
||||
// Set new MSAA and recreate swapchain (render pass, depth, MSAA image, framebuffers)
|
||||
vkCtx->setMsaaSamples(samples);
|
||||
vkCtx->recreateSwapchain(window->getWidth(), window->getHeight());
|
||||
|
||||
// Recreate all sub-renderer pipelines (they embed sample count from render pass)
|
||||
if (terrainRenderer) terrainRenderer->recreatePipelines();
|
||||
if (waterRenderer) waterRenderer->recreatePipelines();
|
||||
if (wmoRenderer) wmoRenderer->recreatePipelines();
|
||||
if (m2Renderer) m2Renderer->recreatePipelines();
|
||||
if (characterRenderer) characterRenderer->recreatePipelines();
|
||||
if (questMarkerRenderer) questMarkerRenderer->recreatePipelines();
|
||||
if (weather) weather->recreatePipelines();
|
||||
if (swimEffects) swimEffects->recreatePipelines();
|
||||
if (mountDust) mountDust->recreatePipelines();
|
||||
if (chargeEffect) chargeEffect->recreatePipelines();
|
||||
|
||||
// Sky system sub-renderers
|
||||
if (skySystem) {
|
||||
if (auto* sb = skySystem->getSkybox()) sb->recreatePipelines();
|
||||
if (auto* sf = skySystem->getStarField()) sf->recreatePipelines();
|
||||
if (auto* ce = skySystem->getCelestial()) ce->recreatePipelines();
|
||||
if (auto* cl = skySystem->getClouds()) cl->recreatePipelines();
|
||||
if (auto* lf = skySystem->getLensFlare()) lf->recreatePipelines();
|
||||
}
|
||||
|
||||
// Lightning is standalone (not instantiated in Renderer, no action needed)
|
||||
// Selection circle + overlay use lazy init, just destroy them
|
||||
VkDevice device = vkCtx->getDevice();
|
||||
if (selCirclePipeline) { vkDestroyPipeline(device, selCirclePipeline, nullptr); selCirclePipeline = VK_NULL_HANDLE; }
|
||||
if (overlayPipeline) { vkDestroyPipeline(device, overlayPipeline, nullptr); overlayPipeline = VK_NULL_HANDLE; }
|
||||
|
||||
// Reinitialize ImGui Vulkan backend with new MSAA sample count
|
||||
ImGui_ImplVulkan_Shutdown();
|
||||
ImGui_ImplVulkan_InitInfo initInfo{};
|
||||
initInfo.ApiVersion = VK_API_VERSION_1_1;
|
||||
initInfo.Instance = vkCtx->getInstance();
|
||||
initInfo.PhysicalDevice = vkCtx->getPhysicalDevice();
|
||||
initInfo.Device = vkCtx->getDevice();
|
||||
initInfo.QueueFamily = vkCtx->getGraphicsQueueFamily();
|
||||
initInfo.Queue = vkCtx->getGraphicsQueue();
|
||||
initInfo.DescriptorPool = vkCtx->getImGuiDescriptorPool();
|
||||
initInfo.MinImageCount = 2;
|
||||
initInfo.ImageCount = vkCtx->getSwapchainImageCount();
|
||||
initInfo.PipelineInfoMain.RenderPass = vkCtx->getImGuiRenderPass();
|
||||
initInfo.PipelineInfoMain.MSAASamples = vkCtx->getMsaaSamples();
|
||||
ImGui_ImplVulkan_Init(&initInfo);
|
||||
|
||||
LOG_INFO("MSAA change complete");
|
||||
}
|
||||
|
||||
void Renderer::beginFrame() {
|
||||
if (!vkCtx) return;
|
||||
|
||||
|
|
@ -2784,6 +2844,7 @@ void Renderer::initSelectionCircle() {
|
|||
.setRasterization(VK_POLYGON_MODE_FILL, VK_CULL_MODE_NONE)
|
||||
.setNoDepthTest()
|
||||
.setColorBlendAttachment(PipelineBuilder::blendAlpha())
|
||||
.setMultisample(vkCtx->getMsaaSamples())
|
||||
.setLayout(selCirclePipelineLayout)
|
||||
.setRenderPass(vkCtx->getImGuiRenderPass())
|
||||
.setDynamicStates({VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR})
|
||||
|
|
@ -2894,6 +2955,7 @@ void Renderer::initOverlayPipeline() {
|
|||
.setRasterization(VK_POLYGON_MODE_FILL, VK_CULL_MODE_NONE)
|
||||
.setNoDepthTest()
|
||||
.setColorBlendAttachment(PipelineBuilder::blendAlpha())
|
||||
.setMultisample(vkCtx->getMsaaSamples())
|
||||
.setLayout(overlayPipelineLayout)
|
||||
.setRenderPass(vkCtx->getImGuiRenderPass())
|
||||
.setDynamicStates({VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR})
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue