1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-06-06 13:17:46 +00:00

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.
This commit is contained in:
Joshua Goins 2025-06-03 05:24:24 -04:00
parent 0fb41c9a88
commit 65b8d8f91e
3 changed files with 25 additions and 2 deletions

View file

@ -103,6 +103,7 @@ private:
Buffer g_AmbientParam;
Buffer g_ShaderTypeParameter;
Buffer g_PbrParameterCommon;
Buffer g_WorldViewMatrix;
Buffer m_planeVertexBuffer;

View file

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

View file

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