diff --git a/extern/libphysis b/extern/libphysis index 5241b08..5b02319 160000 --- a/extern/libphysis +++ b/extern/libphysis @@ -1 +1 @@ -Subproject commit 5241b087e4514cabd4dc825a8ec56ff33d4350ea +Subproject commit 5b023199fa04fbaf550c78e5d06f302a307132a7 diff --git a/renderer/include/gamerenderer.h b/renderer/include/gamerenderer.h index 4822d89..a60e0f3 100644 --- a/renderer/include/gamerenderer.h +++ b/renderer/include/gamerenderer.h @@ -15,6 +15,7 @@ #include "baserenderer.h" #include "buffer.h" +#include "drawobject.h" #include "shaderstructs.h" #include "texture.h" @@ -72,8 +73,8 @@ private: Device &m_device; GameData *m_data = nullptr; - VkDescriptorSet createDescriptorFor(const DrawObject *object, const CachedPipeline &cachedPipeline, int i); - void bindDescriptorSets(VkCommandBuffer commandBuffer, CachedPipeline &pipeline, const DrawObject *object); + VkDescriptorSet createDescriptorFor(const DrawObject *object, const CachedPipeline &cachedPipeline, int i, const RenderMaterial *material); + void bindDescriptorSets(VkCommandBuffer commandBuffer, CachedPipeline &pipeline, const DrawObject *object, const RenderMaterial *material); Buffer g_CameraParameter; Buffer g_InstanceParameter; @@ -81,6 +82,8 @@ private: Buffer g_MaterialParameter; Buffer g_CommonParameter; Buffer g_LightParam; + Buffer g_SceneParameter; + Buffer g_CustomizeParameter; Buffer m_planeVertexBuffer; diff --git a/renderer/include/shaderstructs.h b/renderer/include/shaderstructs.h index 104cf86..d308515 100644 --- a/renderer/include/shaderstructs.h +++ b/renderer/include/shaderstructs.h @@ -44,9 +44,8 @@ struct ModelParameter { ModelParameterStruct g_ModelParameter; }; -struct MaterialParameter { - glm::vec3 g_DiffuseColor; // TODO: align to vec4 - float g_AlphaThreshold; +struct MaterialParameters { + glm::vec4 parameters[6] = {}; // TODO: this is actually different depending on the shpk }; struct CommonParameter { @@ -72,3 +71,20 @@ struct LightParam { glm::mat4 m_LightMapMatrix; glm::mat4 m_WorldViewProjectionMatrix;*/ }; + +struct SceneParameter { + glm::vec4 m_OcclusionIntensity; + glm::vec4 m_Wetness; +}; + +struct CustomizeParameter { + glm::vec4 m_SkinColor; + glm::vec4 m_SkinFresnelValue0; + glm::vec4 m_LipColor; + glm::vec4 m_MainColor; + glm::vec4 m_HairFresnelValue0; + glm::vec4 m_MeshColor; + glm::vec4 m_LeftColor; + glm::vec4 m_RightColor; + glm::vec4 m_OptionColor; +}; diff --git a/renderer/src/gamerenderer.cpp b/renderer/src/gamerenderer.cpp index c05726c..364de09 100644 --- a/renderer/src/gamerenderer.cpp +++ b/renderer/src/gamerenderer.cpp @@ -91,12 +91,11 @@ GameRenderer::GameRenderer(Device &device, GameData *data) // material data { - g_MaterialParameter = m_device.createBuffer(sizeof(MaterialParameter), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT); + g_MaterialParameter = m_device.createBuffer(sizeof(MaterialParameters), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT); - MaterialParameter materialParameter{}; - materialParameter.g_AlphaThreshold = 0.0f; - materialParameter.g_DiffuseColor = glm::vec3(1.0f); - m_device.copyToBuffer(g_MaterialParameter, &materialParameter, sizeof(MaterialParameter)); + MaterialParameters materialParameter{}; + materialParameter.parameters[0] = glm::vec4(1.0f); + m_device.copyToBuffer(g_MaterialParameter, &materialParameter, sizeof(MaterialParameters)); } // light data @@ -120,6 +119,24 @@ GameRenderer::GameRenderer(Device &device, GameData *data) g_CommonParameter = m_device.createBuffer(sizeof(CommonParameter), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT); } + // scene data + { + g_SceneParameter = m_device.createBuffer(sizeof(SceneParameter), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT); + + SceneParameter sceneParameter{}; + + m_device.copyToBuffer(g_SceneParameter, &sceneParameter, sizeof(SceneParameter)); + } + + // customize data + { + g_CustomizeParameter = m_device.createBuffer(sizeof(CustomizeParameter), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT); + + CustomizeParameter customizeParameter{}; + + m_device.copyToBuffer(g_CustomizeParameter, &customizeParameter, sizeof(CustomizeParameter)); + } + VkSamplerCreateInfo samplerInfo = {}; samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; samplerInfo.magFilter = VK_FILTER_LINEAR; @@ -194,6 +211,9 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Ca } std::vector systemKeys; + if (renderMaterial.type == MaterialType::Skin) { + systemKeys.push_back(physis_shpk_crc("DecodeDepthBuffer_RAWZ")); + } std::vector sceneKeys = { physis_shpk_crc("TransformViewSkin"), physis_shpk_crc("GetAmbientLight_SH"), @@ -240,7 +260,7 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Ca physis_Shader pixelShader = renderMaterial.shaderPackage.pixel_shaders[pixelShaderIndice]; auto &pipeline = bindPipeline(commandBuffer, pass, vertexShader, pixelShader); - bindDescriptorSets(commandBuffer, pipeline, &model); + bindDescriptorSets(commandBuffer, pipeline, &model, &renderMaterial); VkDeviceSize offsets[] = {0}; vkCmdBindVertexBuffers(commandBuffer, 0, 1, &part.vertexBuffer.buffer, offsets); @@ -290,7 +310,7 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Ca physis_Shader pixelShader = createViewPositionShpk.pixel_shaders[pixelShaderIndice]; auto &pipeline = bindPipeline(commandBuffer, "PASS_LIGHTING_OPAQUE_VIEWPOSITION", vertexShader, pixelShader); - bindDescriptorSets(commandBuffer, pipeline, nullptr); + bindDescriptorSets(commandBuffer, pipeline, nullptr, nullptr); VkDeviceSize offsets[] = {0}; vkCmdBindVertexBuffers(commandBuffer, 0, 1, &m_planeVertexBuffer.buffer, offsets); @@ -342,7 +362,7 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Ca physis_Shader pixelShader = directionalLightningShpk.pixel_shaders[pixelShaderIndice]; auto &pipeline = bindPipeline(commandBuffer, pass, vertexShader, pixelShader); - bindDescriptorSets(commandBuffer, pipeline, nullptr); + bindDescriptorSets(commandBuffer, pipeline, nullptr, nullptr); VkDeviceSize offsets[] = {0}; vkCmdBindVertexBuffers(commandBuffer, 0, 1, &m_planeVertexBuffer.buffer, offsets); @@ -889,7 +909,7 @@ spirv_cross::CompilerGLSL GameRenderer::getShaderModuleResources(const physis_Sh return spirv_cross::CompilerGLSL(result.code.data(), result.code.dwords()); } -VkDescriptorSet GameRenderer::createDescriptorFor(const DrawObject *object, const CachedPipeline &pipeline, int i) +VkDescriptorSet GameRenderer::createDescriptorFor(const DrawObject *object, const CachedPipeline &pipeline, int i, const RenderMaterial *material) { VkDescriptorSet set; @@ -948,8 +968,12 @@ VkDescriptorSet GameRenderer::createDescriptorFor(const DrawObject *object, cons info->imageView = m_viewPositionBuffer.imageView; } else if (strcmp(name, "g_SamplerDepth") == 0) { info->imageView = m_depthBuffer.imageView; + } else if (strcmp(name, "g_SamplerNormal") == 0) { + Q_ASSERT(material); + info->imageView = material->normalTexture->view; } else { info->imageView = m_dummyTex.imageView; + qInfo() << "Unknown image" << name; } p++; @@ -992,6 +1016,10 @@ VkDescriptorSet GameRenderer::createDescriptorFor(const DrawObject *object, cons useUniformBuffer(g_LightParam); } else if (strcmp(name, "g_CommonParameter") == 0) { useUniformBuffer(g_CommonParameter); + } else if (strcmp(name, "g_CustomizeParameter") == 0) { + useUniformBuffer(g_CustomizeParameter); + } else if (strcmp(name, "g_SceneParameter") == 0) { + useUniformBuffer(g_SceneParameter); } else { qInfo() << "Unknown resource:" << name; info->buffer = m_dummyBuffer.buffer; @@ -1058,12 +1086,15 @@ Texture &GameRenderer::getCompositeTexture() return m_compositeBuffer; } -void GameRenderer::bindDescriptorSets(VkCommandBuffer commandBuffer, GameRenderer::CachedPipeline &pipeline, const DrawObject *object) +void GameRenderer::bindDescriptorSets(VkCommandBuffer commandBuffer, + GameRenderer::CachedPipeline &pipeline, + const DrawObject *object, + const RenderMaterial *material) { int i = 0; for (auto setLayout : pipeline.setLayouts) { if (!pipeline.cachedDescriptors.count(i)) { - if (auto descriptor = createDescriptorFor(object, pipeline, i); descriptor != VK_NULL_HANDLE) { + if (auto descriptor = createDescriptorFor(object, pipeline, i, material); descriptor != VK_NULL_HANDLE) { pipeline.cachedDescriptors[i] = descriptor; } else { continue;