From 65b8d8f91e820f910d6c096b153438157c0795b9 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Tue, 3 Jun 2025 05:24:24 -0400 Subject: [PATCH] Fix perspective/view matrices in Dawntrail renderer After staring at Renderdoc for a while, I finally figured out the magic combination to make this work. For static models, we need a new constant buffer for the view(?) matrix. --- renderer/include/gamerenderer.h | 1 + renderer/include/shaderstructs.h | 8 ++++++++ renderer/src/gamerenderer.cpp | 18 ++++++++++++++++-- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/renderer/include/gamerenderer.h b/renderer/include/gamerenderer.h index f0e7cc2..be19efb 100644 --- a/renderer/include/gamerenderer.h +++ b/renderer/include/gamerenderer.h @@ -103,6 +103,7 @@ private: Buffer g_AmbientParam; Buffer g_ShaderTypeParameter; Buffer g_PbrParameterCommon; + Buffer g_WorldViewMatrix; Buffer m_planeVertexBuffer; diff --git a/renderer/include/shaderstructs.h b/renderer/include/shaderstructs.h index 055f48b..1448001 100644 --- a/renderer/include/shaderstructs.h +++ b/renderer/include/shaderstructs.h @@ -114,3 +114,11 @@ struct ShaderTypeParameter { struct PbrParameterCommon { glm::vec4 unk; }; + +// Dawntrail +// Only found in static models, not skinned ones? +struct WorldViewMatrix { + glm::mat4 m_WorldViewMatrix; + glm::vec4 m_EyePosition; + glm::vec4 m_Unk; +}; diff --git a/renderer/src/gamerenderer.cpp b/renderer/src/gamerenderer.cpp index 370ddd9..01b82aa 100644 --- a/renderer/src/gamerenderer.cpp +++ b/renderer/src/gamerenderer.cpp @@ -242,6 +242,12 @@ GameRenderer::GameRenderer(Device &device, GameData *data) m_device.copyToBuffer(g_PbrParameterCommon, &pbrParameterCommon, sizeof(PbrParameterCommon)); } + // worldViewMatrix + if (m_dawntrailMode) { + g_WorldViewMatrix = m_device.createBuffer(sizeof(WorldViewMatrix), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT); + m_device.nameBuffer(g_WorldViewMatrix, "g_WorldViewMatrix"); + } + VkSamplerCreateInfo samplerInfo = {}; samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; samplerInfo.magFilter = VK_FILTER_NEAREST; @@ -276,7 +282,7 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, Camera &camera, Scene & const glm::mat4 viewProjectionMatrix = camera.perspective * camera.view; // unknown - cameraParameter.m_unknownMatrix = glm::transpose(glm::inverse(camera.view)); + cameraParameter.m_unknownMatrix = glm::transpose(camera.perspective); cameraParameter.m_ViewMatrix = glm::transpose(camera.view); cameraParameter.m_InverseViewMatrix = cameraParameter.m_unknownMatrix; @@ -287,12 +293,18 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, Camera &camera, Scene & cameraParameter.m_InverseProjectionMatrix = glm::transpose(glm::inverse(viewProjectionMatrix)); cameraParameter.m_ProjectionMatrix = glm::transpose(viewProjectionMatrix); - cameraParameter.m_MainViewToProjectionMatrix = glm::transpose(glm::inverse(camera.perspective)); + cameraParameter.m_MainViewToProjectionMatrix = glm::transpose(camera.perspective); cameraParameter.m_EyePosition = glm::vec4(camera.position, 0.0f); cameraParameter.m_LookAtVector = glm::vec4(0.0f); // placeholder m_device.copyToBuffer(g_CameraParameter, &cameraParameter, sizeof(CameraParameter)); + WorldViewMatrix worldViewMatrix; + worldViewMatrix.m_WorldViewMatrix = cameraParameter.m_ViewMatrix; + worldViewMatrix.m_EyePosition = glm::vec4(camera.position, 0.0f); + + m_device.copyToBuffer(g_WorldViewMatrix, &worldViewMatrix, sizeof(WorldViewMatrix)); + int i = 0; for (const auto &pass : passes) { // hardcoded to the known pass for now @@ -1412,6 +1424,8 @@ GameRenderer::createDescriptorFor(const DrawObject *object, const CachedPipeline useUniformBuffer(g_ShaderTypeParameter); } else if (strcmp(name, "g_PbrParameterCommon") == 0) { useUniformBuffer(g_PbrParameterCommon); + } else if (strcmp(name, "g_WorldViewMatrix") == 0) { + useUniformBuffer(g_WorldViewMatrix); } else { qInfo() << "Unknown resource:" << name; info->buffer = m_dummyBuffer.buffer;