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:
parent
0fb41c9a88
commit
65b8d8f91e
3 changed files with 25 additions and 2 deletions
|
@ -103,6 +103,7 @@ private:
|
|||
Buffer g_AmbientParam;
|
||||
Buffer g_ShaderTypeParameter;
|
||||
Buffer g_PbrParameterCommon;
|
||||
Buffer g_WorldViewMatrix;
|
||||
|
||||
Buffer m_planeVertexBuffer;
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue