From 1ff3ddf9a371c449fb497e68245e83e94c02126b Mon Sep 17 00:00:00 2001 From: Dynamitos Date: Tue, 2 Jan 2024 16:48:03 +0100 Subject: [PATCH] Fixing skybox --- res/shaders/BasePass.slang | 2 +- res/shaders/MeshletBasePass.slang | 3 +- res/shaders/lib/BRDF.slang | 33 +++++---- src/Editor/Asset/MeshLoader.cpp | 4 +- src/Engine/Component/Camera.h | 12 +-- .../Graphics/RenderPass/SkyboxRenderPass.cpp | 33 +++++++-- .../Graphics/RenderPass/SkyboxRenderPass.h | 7 ++ src/Engine/Graphics/Vulkan/Allocator.cpp | 2 +- src/Engine/Graphics/Vulkan/Buffer.cpp | 73 +++++++++++++++++++ src/Engine/Graphics/Vulkan/Graphics.cpp | 37 +++++----- src/Engine/Graphics/Vulkan/Texture.cpp | 2 + 11 files changed, 159 insertions(+), 49 deletions(-) diff --git a/res/shaders/BasePass.slang b/res/shaders/BasePass.slang index 1616e55..a6f4f3a 100644 --- a/res/shaders/BasePass.slang +++ b/res/shaders/BasePass.slang @@ -29,5 +29,5 @@ float4 fragmentMain(in FragmentParameter params) : SV_Target { result += pLightEnv.pointLights[i].illuminate(lightingParams, brdf); } - return float4(params.vertexColor, 1.0f); + return float4(result, 1.0f); } diff --git a/res/shaders/MeshletBasePass.slang b/res/shaders/MeshletBasePass.slang index a5800f4..825d6b5 100644 --- a/res/shaders/MeshletBasePass.slang +++ b/res/shaders/MeshletBasePass.slang @@ -51,7 +51,7 @@ void taskMain( { uint m = mesh.meshletOffset + i; MeshletDescription meshlet = pScene.meshletInfos[m]; - if(meshlet.boundingBox.insideFrustum(localToClip, viewFrustum)) + //if(meshlet.boundingBox.insideFrustum(localToClip, viewFrustum)) { uint index; InterlockedAdd(head, 1, index); @@ -120,7 +120,6 @@ void meshMain( { uint vertexIndex = pScene.vertexIndices[m.vertexOffset + v]; VertexAttributes attr = pVertexData.getAttributes(md.indicesOffset + vertexIndex); - attr.vertexColor = m.color; vertices[v] = attr.getParameter(inst.transformMatrix); } } diff --git a/res/shaders/lib/BRDF.slang b/res/shaders/lib/BRDF.slang index 938019a..8ceed43 100644 --- a/res/shaders/lib/BRDF.slang +++ b/res/shaders/lib/BRDF.slang @@ -34,23 +34,30 @@ struct BlinnPhong : IBRDF } }; -struct DisneyBRDF : IBRDF +struct CelShading : IBRDF { float3 baseColor; - float metallic = 0; - float3 normal = float3(0, 1, 0); - float subsurface = 0; - float specular = 0.5; - float roughness = 0.5; - float specularTint = 0; - float anisotropic = 0; - float sheen = 0; - float sheenTint = 0.5f; - float clearCoat = 0; - float clearCoatGloss = 1; + float3 normal; + + __init() + { + normal = float3(0, 0, 1); + } float3 evaluate(float3x3 tbn, float3 viewDir_TS, float3 lightDir_TS, float3 lightColor) { - return baseColor; + float3 normal_TS = normalize(normal); + float nDotL = dot(normal_TS, lightDir_TS); + float diffuse = max(nDotL, 0); + + float3 darkenedBase = baseColor * 0.8; + if(diffuse > 0.5) + { + return baseColor * lightColor; + } + else + { + return darkenedBase * lightColor; + } } }; diff --git a/src/Editor/Asset/MeshLoader.cpp b/src/Editor/Asset/MeshLoader.cpp index 0069cc8..a0605d5 100644 --- a/src/Editor/Asset/MeshLoader.cpp +++ b/src/Editor/Asset/MeshLoader.cpp @@ -51,7 +51,7 @@ void MeshLoader::loadMaterials(const aiScene* scene, const std::string& baseName std::string materialName = std::format("{0}{1}{2}", baseName, material->GetName().C_Str(), i); materialName.erase(std::remove(materialName.begin(), materialName.end(), '.'), materialName.end()); // dots break adding the .asset extension later matCode["name"] = materialName; - matCode["profile"] = "BlinnPhong"; //TODO: other shading models + matCode["profile"] = "CelShading"; aiString texPath; uint32 baseColorIndex = 0; uint32 normalIndex = 0; @@ -176,7 +176,7 @@ void MeshLoader::loadMaterials(const aiScene* scene, const std::string& baseName matCode["code"].push_back( { { "exp", "BRDF" }, - { "profile", "BlinnPhong" }, + { "profile", matCode["profile"]}, { "values", { { "baseColor", baseColorIndex }, { "normal", normalIndex }, diff --git a/src/Engine/Component/Camera.h b/src/Engine/Component/Camera.h index 1cfc50d..2f9609d 100644 --- a/src/Engine/Component/Camera.h +++ b/src/Engine/Component/Camera.h @@ -28,13 +28,15 @@ struct Camera void moveX(float amount); void moveY(float amount); void buildViewMatrix(); - Matrix4 viewMatrix; - Vector cameraPos; - //Transforms relative to actor - float yaw; - float pitch; + bool mainCamera = false; private: + float yaw; + float pitch; + // Spring arm transform + Math::Transform relativeTransform; + Matrix4 viewMatrix; + Vector cameraPos; bool bNeedsViewBuild; }; } // namespace Component diff --git a/src/Engine/Graphics/RenderPass/SkyboxRenderPass.cpp b/src/Engine/Graphics/RenderPass/SkyboxRenderPass.cpp index 1155eab..af8b188 100644 --- a/src/Engine/Graphics/RenderPass/SkyboxRenderPass.cpp +++ b/src/Engine/Graphics/RenderPass/SkyboxRenderPass.cpp @@ -11,7 +11,7 @@ SkyboxRenderPass::SkyboxRenderPass(Gfx::PGraphics graphics, PScene scene) skybox = Seele::Component::Skybox{ .day = AssetRegistry::findTexture("FS000_Day_01")->getTexture().cast(), .night = AssetRegistry::findTexture("FS000_Night_01")->getTexture().cast(), - .fogColor = Vector(0.2, 0.1, 0.6), + .fogColor = Vector(0.1, 0.1, 0.8), .blendFactor = 0, }; } @@ -27,8 +27,13 @@ void SkyboxRenderPass::beginFrame(const Component::Camera& cam) skyboxDataLayout->reset(); textureLayout->reset(); + skyboxData.transformMatrix = glm::rotate(skyboxData.transformMatrix, (float)(Gfx::getCurrentFrameDelta()), Vector(0, 1, 0)); + skyboxBuffer->updateContents(DataSource{ + .size = sizeof(SkyboxData), + .data = (uint8*)&skyboxData, + }); skyboxDataSet = skyboxDataLayout->allocateDescriptorSet(); - skyboxDataSet->updateBuffer(0, viewParamsBuffer); + skyboxDataSet->updateBuffer(0, skyboxBuffer); skyboxDataSet->writeChanges(); textureSet = textureLayout->allocateDescriptorSet(); textureSet->updateTexture(0, skybox.day); @@ -82,11 +87,24 @@ void SkyboxRenderPass::createRenderPass() }; renderPass = graphics->createRenderPass(std::move(layout), viewport); - ShaderCreateInfo createInfo; - createInfo.name = "SkyboxVertex"; - createInfo.additionalModules.add("Skybox"); - createInfo.mainModule = "Skybox"; - createInfo.entryPoint = "vertexMain"; + skyboxData.transformMatrix = Matrix4(1); + skyboxData.fogColor = skybox.fogColor; + skyboxData.blendFactor = skybox.blendFactor; + + skyboxBuffer = graphics->createUniformBuffer(UniformBufferCreateInfo{ + .sourceData = { + .size = sizeof(SkyboxData), + .data = (uint8*)&skyboxData, + }, + .dynamic = true, + }); + + ShaderCreateInfo createInfo = { + .mainModule = "Skybox", + .additionalModules = {"Skybox"}, + .name = "SkyboxVertex", + .entryPoint = "vertexMain", + }; vertexShader = graphics->createVertexShader(createInfo); createInfo.name = "SkyboxFragment"; @@ -103,7 +121,6 @@ void SkyboxRenderPass::createRenderPass() gfxInfo.vertexShader = vertexShader; gfxInfo.fragmentShader = fragmentShader; gfxInfo.rasterizationState.polygonMode = Gfx::SE_POLYGON_MODE_FILL; - gfxInfo.rasterizationState.lineWidth = 5.f; gfxInfo.topology = Gfx::SE_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; gfxInfo.pipelineLayout = std::move(pipelineLayout); gfxInfo.renderPass = renderPass; diff --git a/src/Engine/Graphics/RenderPass/SkyboxRenderPass.h b/src/Engine/Graphics/RenderPass/SkyboxRenderPass.h index 151f68f..85fed84 100644 --- a/src/Engine/Graphics/RenderPass/SkyboxRenderPass.h +++ b/src/Engine/Graphics/RenderPass/SkyboxRenderPass.h @@ -28,6 +28,13 @@ private: Gfx::OFragmentShader fragmentShader; Gfx::PGraphicsPipeline pipeline; Gfx::OSampler skyboxSampler; + struct SkyboxData + { + Matrix4 transformMatrix; + Vector fogColor; + float blendFactor; + } skyboxData; + Gfx::OUniformBuffer skyboxBuffer; Component::Skybox skybox; }; DEFINE_REF(SkyboxRenderPass) diff --git a/src/Engine/Graphics/Vulkan/Allocator.cpp b/src/Engine/Graphics/Vulkan/Allocator.cpp index c1973fa..c278f03 100644 --- a/src/Engine/Graphics/Vulkan/Allocator.cpp +++ b/src/Engine/Graphics/Vulkan/Allocator.cpp @@ -367,5 +367,5 @@ OStagingBuffer StagingManager::create(uint64 size, Gfx::QueueType owner) void StagingManager::release(OStagingBuffer buffer) { - freeBuffers.add(std::move(buffer)); + //freeBuffers.add(std::move(buffer)); } diff --git a/src/Engine/Graphics/Vulkan/Buffer.cpp b/src/Engine/Graphics/Vulkan/Buffer.cpp index 4aa6c16..b499b7b 100644 --- a/src/Engine/Graphics/Vulkan/Buffer.cpp +++ b/src/Engine/Graphics/Vulkan/Buffer.cpp @@ -252,7 +252,31 @@ void Buffer::unmap() .dstOffset = pending.offset, .size = pending.size, }; + VkBufferMemoryBarrier barrier = { + .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, + .pNext = nullptr, + .srcAccessMask = VK_ACCESS_MEMORY_READ_BIT, + .dstAccessMask = VK_ACCESS_MEMORY_WRITE_BIT, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .buffer = buffers[currentBuffer].buffer, + .offset = 0, + .size = size, + }; + vkCmdPipelineBarrier(cmdHandle, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 1, &barrier, 0, nullptr); vkCmdCopyBuffer(cmdHandle, stagingBuffer->getHandle(), buffers[currentBuffer].buffer, 1, ®ion); + barrier = { + .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, + .pNext = nullptr, + .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT, + .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .buffer = buffers[currentBuffer].buffer, + .offset = 0, + .size = size, + }; + vkCmdPipelineBarrier(cmdHandle, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 1, &barrier, 0, nullptr); } //requestOwnershipTransfer(pending.prevQueue); graphics->getStagingManager()->release(std::move(pending.stagingBuffer)); @@ -317,7 +341,31 @@ void UniformBuffer::unmap() VkBufferCopy region; std::memset(®ion, 0, sizeof(VkBufferCopy)); region.size = Vulkan::Buffer::size; + VkBufferMemoryBarrier barrier = { + .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, + .pNext = nullptr, + .srcAccessMask = VK_ACCESS_MEMORY_READ_BIT, + .dstAccessMask = VK_ACCESS_MEMORY_WRITE_BIT, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .buffer = buffers[currentBuffer].buffer, + .offset = 0, + .size = size, + }; + vkCmdPipelineBarrier(cmdHandle, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 1, &barrier, 0, nullptr); vkCmdCopyBuffer(cmdHandle, dedicatedStagingBuffer->getHandle(), buffers[currentBuffer].buffer, 1, ®ion); + barrier = { + .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, + .pNext = nullptr, + .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT, + .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .buffer = buffers[currentBuffer].buffer, + .offset = 0, + .size = size, + }; + vkCmdPipelineBarrier(cmdHandle, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 1, &barrier, 0, nullptr); } else { @@ -408,7 +456,32 @@ void ShaderBuffer::unmap() .dstOffset = 0, .size = Vulkan::Buffer::size, }; + + VkBufferMemoryBarrier barrier = { + .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, + .pNext = nullptr, + .srcAccessMask = VK_ACCESS_MEMORY_READ_BIT, + .dstAccessMask = VK_ACCESS_MEMORY_WRITE_BIT, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .buffer = buffers[currentBuffer].buffer, + .offset = 0, + .size = size, + }; + vkCmdPipelineBarrier(cmdHandle, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 1, &barrier, 0, nullptr); vkCmdCopyBuffer(cmdHandle, dedicatedStagingBuffer->getHandle(), buffers[currentBuffer].buffer, 1, ®ion); + barrier = { + .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, + .pNext = nullptr, + .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT, + .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .buffer = buffers[currentBuffer].buffer, + .offset = 0, + .size = size, + }; + vkCmdPipelineBarrier(cmdHandle, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 1, &barrier, 0, nullptr); } else { diff --git a/src/Engine/Graphics/Vulkan/Graphics.cpp b/src/Engine/Graphics/Vulkan/Graphics.cpp index db90965..778f889 100644 --- a/src/Engine/Graphics/Vulkan/Graphics.cpp +++ b/src/Engine/Graphics/Vulkan/Graphics.cpp @@ -360,29 +360,31 @@ Array Graphics::getRequiredExtensions() void Graphics::initInstance(GraphicsInitializer initInfo) { glfwInit(); - VkApplicationInfo appInfo = {}; - appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; - appInfo.pApplicationName = initInfo.applicationName; - appInfo.applicationVersion = VK_MAKE_VERSION(0, 0, 1); - appInfo.pEngineName = initInfo.engineName; - appInfo.engineVersion = VK_MAKE_VERSION(0, 0, 1); - appInfo.apiVersion = VK_API_VERSION_1_2; - - VkInstanceCreateInfo info = {}; - info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; - info.pApplicationInfo = &appInfo; - Array extensions = getRequiredExtensions(); + VkApplicationInfo appInfo = { + .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, + .pApplicationName = initInfo.applicationName, + .applicationVersion = VK_MAKE_VERSION(0, 0, 1), + .pEngineName = initInfo.engineName, + .engineVersion = VK_MAKE_VERSION(0, 0, 1), + .apiVersion = VK_API_VERSION_1_2, + }; + + Array extensions = getRequiredExtensions(); for (uint32 i = 0; i < initInfo.instanceExtensions.size(); ++i) { extensions.add(initInfo.instanceExtensions[i]); } - info.enabledExtensionCount = (uint32)extensions.size(); - info.ppEnabledExtensionNames = extensions.data(); #if ENABLE_VALIDATION initInfo.layers.add("VK_LAYER_KHRONOS_validation"); #endif - info.enabledLayerCount = (uint32)initInfo.layers.size(); - info.ppEnabledLayerNames = initInfo.layers.data(); + VkInstanceCreateInfo info = { + .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, + .pApplicationInfo = &appInfo, + .enabledLayerCount = (uint32)initInfo.layers.size(), + .ppEnabledLayerNames = initInfo.layers.data(), + .enabledExtensionCount = (uint32)extensions.size(), + .ppEnabledExtensionNames = extensions.data(), + }; VK_CHECK(vkCreateInstance(&info, nullptr, &instance)); } void Graphics::setupDebugCallback() @@ -438,6 +440,7 @@ void Graphics::pickPhysicalDevice() vkGetPhysicalDeviceProperties(physicalDevice, &props); vkGetPhysicalDeviceFeatures2(physicalDevice, &features); + features.features.robustBufferAccess = 0; if (Gfx::useMeshShading) { uint32 count = 0; @@ -448,7 +451,7 @@ void Graphics::pickPhysicalDevice() { if (std::strcmp(VK_EXT_MESH_SHADER_EXTENSION_NAME, extensionProps[i].extensionName) == 0) { - meshShadingEnabled = true; + //meshShadingEnabled = true; break; } } diff --git a/src/Engine/Graphics/Vulkan/Texture.cpp b/src/Engine/Graphics/Vulkan/Texture.cpp index defdca7..ca31e6a 100644 --- a/src/Engine/Graphics/Vulkan/Texture.cpp +++ b/src/Engine/Graphics/Vulkan/Texture.cpp @@ -204,6 +204,8 @@ void TextureBase::changeLayout(Gfx::SeImageLayout newLayout) VkImageMemoryBarrier barrier = { .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, .pNext = nullptr, + .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT, + .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT, .oldLayout = cast(layout), .newLayout = cast(newLayout), .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,