diff --git a/renderer/CMakeLists.txt b/renderer/CMakeLists.txt index f893f4e..e3cb90f 100644 --- a/renderer/CMakeLists.txt +++ b/renderer/CMakeLists.txt @@ -15,6 +15,7 @@ target_sources(renderer include/drawobject.h include/gamerenderer.h include/rendermanager.h + include/scene.h include/shaderstructs.h include/simplerenderer.h include/swapchain.h diff --git a/renderer/include/baserenderer.h b/renderer/include/baserenderer.h index 919fa3b..ce51d02 100644 --- a/renderer/include/baserenderer.h +++ b/renderer/include/baserenderer.h @@ -17,6 +17,7 @@ class Renderer; struct DrawObject; struct Camera; struct Texture; +struct Scene; /// Base class for all rendering implementations class BaseRenderer @@ -28,7 +29,7 @@ public: virtual void resize() = 0; /// Render a frame into @p commandBuffer. @p currentFrame is the same value as SwapChain::currentFrame for convenience. - virtual void render(VkCommandBuffer commandBuffer, uint32_t currentFrame, Camera &camera, const std::vector &models) = 0; + virtual void render(VkCommandBuffer commandBuffer, uint32_t currentFrame, Camera &camera, Scene &scene, const std::vector &models) = 0; /// The final composite texture that is drawn into with render() virtual Texture &getCompositeTexture() = 0; diff --git a/renderer/include/camera.h b/renderer/include/camera.h index 51d11af..78ebfed 100644 --- a/renderer/include/camera.h +++ b/renderer/include/camera.h @@ -16,7 +16,7 @@ struct Camera { float nearPlane = 0.1f; /// Far plane - float farPlane = 100.0f; + float farPlane = 1000.0f; glm::mat4 perspective, view; glm::vec3 position; diff --git a/renderer/include/device.h b/renderer/include/device.h index aeebf5c..05a7ba3 100644 --- a/renderer/include/device.h +++ b/renderer/include/device.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include @@ -35,7 +36,7 @@ public: Texture createTexture(int width, int height, VkFormat format, VkImageUsageFlags usage); - Texture createDummyTexture(); + Texture createDummyTexture(std::array values = {255, 255, 255, 255}); Buffer createDummyBuffer(); VkCommandBuffer beginSingleTimeCommands(); diff --git a/renderer/include/gamerenderer.h b/renderer/include/gamerenderer.h index b2178ab..f7f9c78 100644 --- a/renderer/include/gamerenderer.h +++ b/renderer/include/gamerenderer.h @@ -30,7 +30,7 @@ public: void resize() override; - void render(VkCommandBuffer commandBuffer, uint32_t currentFrame, Camera &camera, const std::vector &models) override; + void render(VkCommandBuffer commandBuffer, uint32_t currentFrame, Camera &camera, Scene &scene, const std::vector &models) override; Texture &getCompositeTexture() override; @@ -104,5 +104,7 @@ private: Texture m_ZBuffer; // what is this? Texture m_dummyTex; VkSampler m_sampler; + VkSampler m_normalSampler; Buffer m_dummyBuffer; + Texture m_placeholderTileNormal; }; \ No newline at end of file diff --git a/renderer/include/rendermanager.h b/renderer/include/rendermanager.h index 12dbe85..7ce0dc8 100644 --- a/renderer/include/rendermanager.h +++ b/renderer/include/rendermanager.h @@ -15,6 +15,7 @@ #include "camera.h" #include "device.h" #include "drawobject.h" +#include "scene.h" class ImGuiPass; struct ImGuiContext; @@ -40,6 +41,7 @@ public: VkRenderPass presentationRenderPass() const; Camera camera; + Scene scene; ImGuiContext *ctx = nullptr; diff --git a/renderer/include/scene.h b/renderer/include/scene.h new file mode 100644 index 0000000..e9f816a --- /dev/null +++ b/renderer/include/scene.h @@ -0,0 +1,9 @@ +// SPDX-FileCopyrightText: 2024 Joshua Goins +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +struct Scene { + glm::vec3 sunDirection; + glm::vec3 pointLightPosition; +}; \ No newline at end of file diff --git a/renderer/include/shaderstructs.h b/renderer/include/shaderstructs.h index a2d1fc8..070c5fa 100644 --- a/renderer/include/shaderstructs.h +++ b/renderer/include/shaderstructs.h @@ -12,8 +12,8 @@ struct CameraParameter { glm::mat4 m_InverseProjectionMatrix; // used for view position recalc glm::mat4 m_ProjectionMatrix; // FIXME: ourburos is wrong, this is actually viewProjection glm::mat4 m_MainViewToProjectionMatrix; - glm::vec3 m_EyePosition; - glm::vec3 m_LookAtVector; + glm::vec4 m_EyePosition; + glm::vec4 m_LookAtVector; }; struct JointMatrixArray { diff --git a/renderer/include/simplerenderer.h b/renderer/include/simplerenderer.h index 1b24b32..fa73c4e 100644 --- a/renderer/include/simplerenderer.h +++ b/renderer/include/simplerenderer.h @@ -30,7 +30,7 @@ public: void resize() override; - void render(VkCommandBuffer commandBuffer, uint32_t currentFrame, Camera &camera, const std::vector &models) override; + void render(VkCommandBuffer commandBuffer, uint32_t currentFrame, Camera &camera, Scene &scene, const std::vector &models) override; Texture &getCompositeTexture() override; diff --git a/renderer/src/device.cpp b/renderer/src/device.cpp index c9afa81..9bc55a1 100644 --- a/renderer/src/device.cpp +++ b/renderer/src/device.cpp @@ -135,7 +135,7 @@ Texture Device::createTexture(const int width, const int height, const VkFormat return {format, viewCreateInfo.subresourceRange, image, imageView, imageMemory}; } -Texture Device::createDummyTexture() +Texture Device::createDummyTexture(std::array values) { auto texture = createTexture(1, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT); @@ -164,12 +164,10 @@ Texture Device::createDummyTexture() vkBindBufferMemory(device, stagingBuffer, stagingBufferMemory, 0); - uint8_t dummydata[4] = {255, 255, 255, 255}; - // copy to staging buffer void *mapped_data; vkMapMemory(device, stagingBufferMemory, 0, 4 * sizeof(uint8_t), 0, &mapped_data); - memcpy(mapped_data, dummydata, 4 * sizeof(uint8_t)); + memcpy(mapped_data, values.data(), 4 * sizeof(uint8_t)); vkUnmapMemory(device, stagingBufferMemory); // copy staging buffer to image diff --git a/renderer/src/gamerenderer.cpp b/renderer/src/gamerenderer.cpp index c9d6813..db12825 100644 --- a/renderer/src/gamerenderer.cpp +++ b/renderer/src/gamerenderer.cpp @@ -20,13 +20,13 @@ // TODO: maybe need UV? // note: SQEX passes the vertice positions as UV coordinates (yes, -1 to 1.) the shaders then transform them back with the g_CommonParameter.m_RenderTarget vec4 const std::vector planeVertices = { - {-1.0f, -1.0f, 0.0f, 1.0f}, - {1.0f, -1.0f, 0.0f, 1.0f}, - {1.0f, 1.0f, 0.0f, 1.0f}, + {1.0f, 1.0f, 1.0f, 1.0f}, + {-1.0f, 1.0f, 1.0f, 1.0f}, + {-1.0f, -1.0f, 1.0f, 1.0f}, - {-1.0f, 1.0f, 0.0f, 1.0f}, - {-1.0f, -1.0f, 0.0f, 1.0f}, - {1.0f, 1.0f, 0.0f, 1.0f}, + {-1.0f, -1.0f, 1.0f, 1.0f}, + {1.0f, -1.0f, 1.0f, 1.0f}, + {1.0f, 1.0f, 1.0f, 1.0f}, }; dxvk::Logger dxvk::Logger::s_instance("dxbc.log"); @@ -61,6 +61,9 @@ GameRenderer::GameRenderer(Device &device, GameData *data) m_dummyTex = m_device.createDummyTexture(); m_dummyBuffer = m_device.createDummyBuffer(); + // don't know how to get tile normal yet + m_placeholderTileNormal = m_device.createDummyTexture({128, 128, 255, 255}); + size_t vertexSize = planeVertices.size() * sizeof(glm::vec4); m_planeVertexBuffer = m_device.createBuffer(vertexSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT); m_device.copyToBuffer(m_planeVertexBuffer, (void *)planeVertices.data(), vertexSize); @@ -84,7 +87,9 @@ GameRenderer::GameRenderer(Device &device, GameData *data) const float wetnessMax = 1.0f; const float maybeWetness = 0.0f; - instanceParameter.g_InstanceParameter.m_Wetness = {maybeWetness, 2.0f, wetnessMin, wetnessMax}; + // instanceParameter.g_InstanceParameter.m_Wetness = {maybeWetness, 2.0f, wetnessMin, wetnessMax}; + // instanceParameter.g_InstanceParameter.m_CameraLight.m_DiffuseSpecular = glm::vec4(1.0f); + // instanceParameter.g_InstanceParameter.m_CameraLight.m_Rim = glm::vec4(1.0f); m_device.copyToBuffer(g_InstanceParameter, &instanceParameter, sizeof(InstanceParameter)); } @@ -178,20 +183,29 @@ GameRenderer::GameRenderer(Device &device, GameData *data) VkSamplerCreateInfo samplerInfo = {}; samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; - samplerInfo.magFilter = VK_FILTER_LINEAR; - samplerInfo.minFilter = VK_FILTER_LINEAR; - samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT; - samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT; - samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT; - samplerInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR; - samplerInfo.maxLod = 1.0f; + samplerInfo.magFilter = VK_FILTER_NEAREST; + samplerInfo.minFilter = VK_FILTER_NEAREST; + samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + samplerInfo.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK; + samplerInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST; + samplerInfo.maxAnisotropy = 1.0f; vkCreateSampler(m_device.device, &samplerInfo, nullptr, &m_sampler); + samplerInfo.magFilter = VK_FILTER_LINEAR; + samplerInfo.minFilter = VK_FILTER_LINEAR; + samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT; + samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT; + samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT; + + vkCreateSampler(m_device.device, &samplerInfo, nullptr, &m_normalSampler); + createImageResources(); } -void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Camera &camera, const std::vector &models) +void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Camera &camera, Scene &scene, const std::vector &models) { // TODO: this shouldn't be here CameraParameter cameraParameter{}; @@ -204,12 +218,12 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Ca cameraParameter.m_InverseViewProjectionMatrix = glm::transpose(glm::inverse(viewProjectionMatrix)); // known params - cameraParameter.m_InverseProjectionMatrix = glm::transpose(glm::inverse(camera.perspective)); + 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_EyePosition = camera.position; // placeholder - cameraParameter.m_LookAtVector = glm::vec3(0.0f); // placeholder + 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)); @@ -276,12 +290,7 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Ca bool found = false; for (int z = 0; z < renderMaterial.mat.num_shader_keys; z++) { if (renderMaterial.mat.shader_keys[z].category == id) { - // TODO: Temporary workaround for materials that need tile normals - if (id == 0xB616DC5A) { - materialKeys.push_back(0x22A4AABF); - } else { - materialKeys.push_back(renderMaterial.mat.shader_keys[z].value); - } + materialKeys.push_back(renderMaterial.mat.shader_keys[z].value); found = true; } } @@ -897,7 +906,7 @@ GameRenderer::bindPipeline(VkCommandBuffer commandBuffer, std::string_view passN rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; rasterizer.lineWidth = 1.0f; rasterizer.cullMode = VK_CULL_MODE_NONE; // TODO: implement cull mode - rasterizer.frontFace = VK_FRONT_FACE_CLOCKWISE; + rasterizer.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; VkPipelineMultisampleStateCreateInfo multisampling = {}; multisampling.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; @@ -905,7 +914,7 @@ GameRenderer::bindPipeline(VkCommandBuffer commandBuffer, std::string_view passN VkPipelineColorBlendAttachmentState colorBlendAttachment = {}; colorBlendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; - colorBlendAttachment.blendEnable = VK_TRUE; + colorBlendAttachment.blendEnable = VK_FALSE; colorBlendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_ONE; colorBlendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ZERO; colorBlendAttachment.colorBlendOp = VK_BLEND_OP_ADD; @@ -957,7 +966,9 @@ GameRenderer::bindPipeline(VkCommandBuffer commandBuffer, std::string_view passN VkPipelineDepthStencilStateCreateInfo depthStencil = {}; depthStencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; - depthStencil.depthTestEnable = VK_TRUE; + if (passName != "PASS_LIGHTING_OPAQUE_VIEWPOSITION") { + depthStencil.depthTestEnable = VK_TRUE; + } if (passName == "PASS_G_OPAQUE") { depthStencil.depthWriteEnable = VK_TRUE; } @@ -1165,6 +1176,8 @@ GameRenderer::createDescriptorFor(const DrawObject *object, const CachedPipeline } else if (strcmp(name, "g_SamplerSpecular") == 0) { Q_ASSERT(material); info->imageView = material->specularTexture->view; + } else if (strcmp(name, "g_SamplerTileNormal") == 0) { + info->imageView = m_placeholderTileNormal.imageView; } else { info->imageView = m_dummyTex.imageView; qInfo() << "Unknown image" << name; @@ -1181,7 +1194,7 @@ GameRenderer::createDescriptorFor(const DrawObject *object, const CachedPipeline auto info = &imageInfo.emplace_back(); descriptorWrite.pImageInfo = info; - info->sampler = m_sampler; + info->sampler = m_normalSampler; } break; case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: { auto info = &bufferInfo.emplace_back(); @@ -1270,7 +1283,7 @@ void GameRenderer::createImageResources() m_viewPositionBuffer = m_device.createTexture(m_device.swapChain->extent.width, m_device.swapChain->extent.height, - VK_FORMAT_R8G8B8A8_UNORM, + VK_FORMAT_R16G16B16A16_SFLOAT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT); m_device.nameTexture(m_viewPositionBuffer, "View Position"); diff --git a/renderer/src/rendermanager.cpp b/renderer/src/rendermanager.cpp index c93399f..60be67b 100644 --- a/renderer/src/rendermanager.cpp +++ b/renderer/src/rendermanager.cpp @@ -404,7 +404,7 @@ void RenderManager::render(const std::vector &models) updateCamera(camera); - m_renderer->render(commandBuffer, m_device->swapChain->currentFrame, camera, models); + m_renderer->render(commandBuffer, m_device->swapChain->currentFrame, camera, scene, models); VkRenderPassBeginInfo renderPassInfo = {}; renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; diff --git a/renderer/src/simplerenderer.cpp b/renderer/src/simplerenderer.cpp index 4fcaf19..3e182b5 100644 --- a/renderer/src/simplerenderer.cpp +++ b/renderer/src/simplerenderer.cpp @@ -48,7 +48,7 @@ void SimpleRenderer::resize() vkCreateFramebuffer(m_device.device, &framebufferInfo, nullptr, &m_framebuffer); } -void SimpleRenderer::render(VkCommandBuffer commandBuffer, uint32_t currentFrame, Camera &camera, const std::vector &models) +void SimpleRenderer::render(VkCommandBuffer commandBuffer, uint32_t currentFrame, Camera &camera, Scene &scene, const std::vector &models) { VkRenderPassBeginInfo renderPassInfo = {}; renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;