mirror of
https://github.com/redstrate/Novus.git
synced 2025-06-07 13:47:45 +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_AmbientParam;
|
||||||
Buffer g_ShaderTypeParameter;
|
Buffer g_ShaderTypeParameter;
|
||||||
Buffer g_PbrParameterCommon;
|
Buffer g_PbrParameterCommon;
|
||||||
|
Buffer g_WorldViewMatrix;
|
||||||
|
|
||||||
Buffer m_planeVertexBuffer;
|
Buffer m_planeVertexBuffer;
|
||||||
|
|
||||||
|
|
|
@ -114,3 +114,11 @@ struct ShaderTypeParameter {
|
||||||
struct PbrParameterCommon {
|
struct PbrParameterCommon {
|
||||||
glm::vec4 unk;
|
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));
|
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 = {};
|
VkSamplerCreateInfo samplerInfo = {};
|
||||||
samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
|
samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
|
||||||
samplerInfo.magFilter = VK_FILTER_NEAREST;
|
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;
|
const glm::mat4 viewProjectionMatrix = camera.perspective * camera.view;
|
||||||
|
|
||||||
// unknown
|
// 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_ViewMatrix = glm::transpose(camera.view);
|
||||||
cameraParameter.m_InverseViewMatrix = cameraParameter.m_unknownMatrix;
|
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_InverseProjectionMatrix = glm::transpose(glm::inverse(viewProjectionMatrix));
|
||||||
cameraParameter.m_ProjectionMatrix = glm::transpose(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_EyePosition = glm::vec4(camera.position, 0.0f);
|
||||||
cameraParameter.m_LookAtVector = glm::vec4(0.0f); // placeholder
|
cameraParameter.m_LookAtVector = glm::vec4(0.0f); // placeholder
|
||||||
|
|
||||||
m_device.copyToBuffer(g_CameraParameter, &cameraParameter, sizeof(CameraParameter));
|
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;
|
int i = 0;
|
||||||
for (const auto &pass : passes) {
|
for (const auto &pass : passes) {
|
||||||
// hardcoded to the known pass for now
|
// hardcoded to the known pass for now
|
||||||
|
@ -1412,6 +1424,8 @@ GameRenderer::createDescriptorFor(const DrawObject *object, const CachedPipeline
|
||||||
useUniformBuffer(g_ShaderTypeParameter);
|
useUniformBuffer(g_ShaderTypeParameter);
|
||||||
} else if (strcmp(name, "g_PbrParameterCommon") == 0) {
|
} else if (strcmp(name, "g_PbrParameterCommon") == 0) {
|
||||||
useUniformBuffer(g_PbrParameterCommon);
|
useUniformBuffer(g_PbrParameterCommon);
|
||||||
|
} else if (strcmp(name, "g_WorldViewMatrix") == 0) {
|
||||||
|
useUniformBuffer(g_WorldViewMatrix);
|
||||||
} else {
|
} else {
|
||||||
qInfo() << "Unknown resource:" << name;
|
qInfo() << "Unknown resource:" << name;
|
||||||
info->buffer = m_dummyBuffer.buffer;
|
info->buffer = m_dummyBuffer.buffer;
|
||||||
|
|
Loading…
Add table
Reference in a new issue