diff --git a/external/vcpkg b/external/vcpkg index 0bf1354..f9a99aa 160000 --- a/external/vcpkg +++ b/external/vcpkg @@ -1 +1 @@ -Subproject commit 0bf1354d6704ec797acea686d0250afc4036a082 +Subproject commit f9a99aa79c1309001e36572fa42d7d8edebfc451 diff --git a/res/shaders/BasePass.slang b/res/shaders/BasePass.slang index 778745c..d00ec01 100644 --- a/res/shaders/BasePass.slang +++ b/res/shaders/BasePass.slang @@ -27,7 +27,7 @@ ParameterBlock pLightCullingData; static const float4x4 biasMat = float4x4( 0.5, 0.0, 0.0, 0.5, - 0.0, -0.5, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0); @@ -51,8 +51,8 @@ float4 fragmentMain(in FragmentParameter params) : SV_Target } } float4 lightSpacePos = mul(pShadowMapping.lightSpaceMatrices[cascadeIndex][i], float4(params.position_WS, 1)); - lightSpacePos = mul(biasMat, lightSpacePos); - float4 shadowCoord = lightSpacePos / lightSpacePos.w; + //lightSpacePos = mul(biasMat, lightSpacePos); + float4 shadowCoord = clipToScreen(lightSpacePos); int3 texDim; pShadowMapping.shadowMaps[cascadeIndex].GetDimensions(texDim.x, texDim.y, texDim.z); float scale = 1.5f; diff --git a/src/Editor/main.cpp b/src/Editor/main.cpp index b65152f..523d479 100644 --- a/src/Editor/main.cpp +++ b/src/Editor/main.cpp @@ -12,11 +12,9 @@ #endif #include "Graphics/StaticMeshVertexData.h" #include "Graphics/Vulkan/Graphics.h" -#include "Window/InspectorView.h" #include "Window/PlayView.h" #include "Window/WindowManager.h" #include -#include using namespace Seele; using namespace Seele::Editor; @@ -26,8 +24,8 @@ static Gfx::OGraphics graphics; int main() { std::string gameName = "MeshShadingDemo"; - std::filesystem::path outputPath = fmt::format("../../../../{0}Game/", gameName); - std::filesystem::path sourcePath = fmt::format("../../../../{0}/", gameName); + std::filesystem::path outputPath = fmt::format("/home/dynamitos/{0}Game/", gameName); + std::filesystem::path sourcePath = fmt::format("/home/dynamitos/{0}/", gameName); #ifdef WIN32 std::string libraryEnding = "dll"; #elif __APPLE__ diff --git a/src/Engine/Component/Camera.h b/src/Engine/Component/Camera.h index 8957220..8c3fd15 100644 --- a/src/Engine/Component/Camera.h +++ b/src/Engine/Component/Camera.h @@ -7,7 +7,7 @@ namespace Seele { namespace Component { struct Camera { float nearPlane = 0.1f; - float farPlane = 1000.0f; + float farPlane = 10000.0f; bool mainCamera = false; }; } // namespace Component diff --git a/src/Engine/Graphics/RenderPass/BasePass.cpp b/src/Engine/Graphics/RenderPass/BasePass.cpp index 4dfaddd..10f7f49 100644 --- a/src/Engine/Graphics/RenderPass/BasePass.cpp +++ b/src/Engine/Graphics/RenderPass/BasePass.cpp @@ -368,10 +368,6 @@ void BasePass::render() { { .cullMode = Gfx::SE_CULL_MODE_BACK_BIT, }, - .depthStencilState = - { - .depthCompareOp = Gfx::SE_COMPARE_OP_GREATER_OR_EQUAL, - }, .colorBlend = { .attachmentCount = 1, @@ -631,7 +627,17 @@ void BasePass::createRenderPass() { }); textureLayout->create(); - skyboxSampler = graphics->createSampler({}); + skyboxSampler = graphics->createSampler({ + .magFilter = Gfx::SE_FILTER_LINEAR, + .minFilter = Gfx::SE_FILTER_LINEAR, + .mipmapMode = Gfx::SE_SAMPLER_MIPMAP_MODE_LINEAR, + .addressModeU = Gfx::SE_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, + .addressModeV = Gfx::SE_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, + .addressModeW = Gfx::SE_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, + .maxAnisotropy = 1.0f, + .minLod = 0, + .maxLod = std::numeric_limits::max(), + }); skyboxData.transformMatrix = Matrix4(1); skyboxData.fogColor = skybox.fogColor; diff --git a/src/Engine/Graphics/RenderPass/ShadowPass.cpp b/src/Engine/Graphics/RenderPass/ShadowPass.cpp index b858e2a..f6faa95 100644 --- a/src/Engine/Graphics/RenderPass/ShadowPass.cpp +++ b/src/Engine/Graphics/RenderPass/ShadowPass.cpp @@ -46,6 +46,7 @@ ShadowPass::~ShadowPass() {} void ShadowPass::beginFrame(const Component::Camera& camera, const Component::Transform& transform) { float cascadeSplits[NUM_CASCADES]; + float splitDepths[NUM_CASCADES]; float nearClip = camera.nearPlane; float farClip = camera.farPlane; @@ -63,49 +64,57 @@ void ShadowPass::beginFrame(const Component::Camera& camera, const Component::Tr float uniform = minZ + range * p; float d = cascadeSplitLambda * (log - uniform) + uniform; cascadeSplits[i] = (d - nearClip) / clipRange; + splitDepths[i] = (camera.nearPlane + cascadeSplits[i] * clipRange) * -1.0f; cascades[i].viewParams.clear(); } - cascadeSplitsBuffer->updateContents(0, sizeof(float) * NUM_CASCADES, cascadeSplits); + cascadeSplitsBuffer->updateContents(0, sizeof(float) * NUM_CASCADES, splitDepths); // call this to update view params member, ignore descriptor set updateViewParameters(camera, transform); - Array frustumCorners = { - Vector(-1.0f, 1.0f, 0.0f), Vector(1.0f, 1.0f, 0.0f), Vector(1.0f, -1.0f, 0.0f), Vector(-1.0f, -1.0f, 0.0f), - Vector(-1.0f, 1.0f, 1.0f), Vector(1.0f, 1.0f, 1.0f), Vector(1.0f, -1.0f, 1.0f), Vector(-1.0f, -1.0f, 1.0f), - }; - - for (auto& c : frustumCorners) { - Vector4 invCorner = viewParams.inverseViewProjectionMatrix * Vector4(c, 1); - c = invCorner / invCorner.w; - } + Matrix4 invCam = viewParams.inverseViewProjectionMatrix; for (uint32 s = 0; s < scene->getLightEnvironment()->getNumDirectionalLights(); ++s) { float lastSplitDist = 0.0; for (uint32 i = 0; i < NUM_CASCADES; ++i) { float splitDist = cascadeSplits[i]; - Array cascadeCorners(8); + Array frustumCorners = { + Vector(-1.0f, 1.0f, 1.0f), + Vector(1.0f, 1.0f, 1.0f), + Vector(1.0f, -1.0f, 1.0f), + Vector(-1.0f, -1.0f, 1.0f), + Vector(-1.0f, 1.0f, 0.0f), + Vector(1.0f, 1.0f, 0.0f), + Vector(1.0f, -1.0f, 0.0f), + Vector(-1.0f, -1.0f, 0.0f), + }; + + for (auto& c : frustumCorners) { + Vector4 invCorner = invCam * Vector4(c, 1); + c = invCorner / invCorner.w; + } for (uint32 j = 0; j < 4; j++) { Vector dist = frustumCorners[j + 4] - frustumCorners[j]; - cascadeCorners[j + 4] = frustumCorners[j] + (dist * splitDist); - cascadeCorners[j] = frustumCorners[j] + (dist * lastSplitDist); + frustumCorners[j + 4] = frustumCorners[j] + (dist * splitDist); + frustumCorners[j] = frustumCorners[j] + (dist * lastSplitDist); } Vector frustumCenter = Vector(0); for (uint32 j = 0; j < 8; j++) { - frustumCenter += cascadeCorners[j]; + frustumCenter += frustumCorners[j]; } frustumCenter /= 8.0f; float radius = 0.0f; for (uint j = 0; j < 8; j++) { - float distance = glm::length(cascadeCorners[j] - frustumCenter); + float distance = glm::length(frustumCorners[j] - frustumCenter); radius = glm::max(radius, distance); } radius = std::ceil(radius * 16.0f) / 16.0f; Vector maxExtents = Vector(radius); Vector minExtents = -maxExtents; - Vector lightDir = glm::normalize(scene->getLightEnvironment()->getDirectionalLight(s).direction); + + Vector lightDir = glm::normalize(-scene->getLightEnvironment()->getDirectionalLight(s).direction); Vector cameraPos = frustumCenter - lightDir * -minExtents.z; Matrix4 viewMatrix = glm::lookAt(cameraPos, frustumCenter, Vector(0, 1, 0)); Matrix4 projectionMatrix = diff --git a/src/Engine/Graphics/VertexData.cpp b/src/Engine/Graphics/VertexData.cpp index 4b82314..b5d6523 100644 --- a/src/Engine/Graphics/VertexData.cpp +++ b/src/Engine/Graphics/VertexData.cpp @@ -568,7 +568,6 @@ void VertexData::updateBuffers() { .size = verticesAllocated * sizeof(Vector), .data = (uint8*)positions.data(), }, - .usage = Gfx::SE_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR, .name = "Positions", }); } diff --git a/src/Engine/Graphics/Vulkan/Buffer.cpp b/src/Engine/Graphics/Vulkan/Buffer.cpp index dea4524..1a54701 100644 --- a/src/Engine/Graphics/Vulkan/Buffer.cpp +++ b/src/Engine/Graphics/Vulkan/Buffer.cpp @@ -483,7 +483,9 @@ IndexBuffer::IndexBuffer(PGraphics graphics, const IndexBufferCreateInfo& create : Gfx::IndexBuffer(graphics->getFamilyMapping(), createInfo), Vulkan::Buffer(graphics, createInfo.sourceData.size, VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | - VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR, + VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | (graphics->supportRayTracing() + ? VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR + : 0), createInfo.sourceData.owner, false, createInfo.name) { getAlloc()->updateContents(createInfo.sourceData.offset, createInfo.sourceData.size, createInfo.sourceData.data); // getAlloc()->pipelineBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_TRANSFER_BIT, Gfx::SE_ACCESS_INDEX_READ_BIT, diff --git a/src/Engine/Graphics/Vulkan/Graphics.cpp b/src/Engine/Graphics/Vulkan/Graphics.cpp index 03f00af..a4b7b11 100644 --- a/src/Engine/Graphics/Vulkan/Graphics.cpp +++ b/src/Engine/Graphics/Vulkan/Graphics.cpp @@ -819,7 +819,7 @@ void Graphics::pickPhysicalDevice() { shaderFloatControls = true; } } - rayTracingEnabled = rayTracingPipelineSupport && accelerationStructureSupport && hostOperationsSupport && deviceAddressSupport && + rayTracingEnabled = false && rayTracingPipelineSupport && accelerationStructureSupport && hostOperationsSupport && deviceAddressSupport && descriptorIndexingSupport && spirv14Support && shaderFloatControls; } diff --git a/src/Engine/Math/Matrix.h b/src/Engine/Math/Matrix.h index 8b1a9b7..91ca6ee 100644 --- a/src/Engine/Math/Matrix.h +++ b/src/Engine/Math/Matrix.h @@ -26,7 +26,7 @@ static Matrix4 perspectiveProjection(float fov, float aspect, float nearPlane, f { 0.0f, 0.0f, - 0.5f * (farPlane + nearPlane) / (nearPlane - farPlane), + nearPlane / (nearPlane - farPlane), -1.0f, }, { @@ -54,13 +54,13 @@ static Matrix4 orthographicProjection(float left, float right, float bottom, flo { 0.0f, 0.0f, - -2.0f / (farPlane - nearPlane), + -2.0f / (nearPlane - farPlane), 0.0f, }, { -(right + left) / (right - left), -(top + bottom) / (top - bottom), - -(farPlane + nearPlane) / (farPlane - nearPlane), + -(nearPlane + farPlane) / (nearPlane - farPlane), 1.0f, }, }; diff --git a/src/Engine/Math/Vector.h b/src/Engine/Math/Vector.h index abf34af..2d8204f 100644 --- a/src/Engine/Math/Vector.h +++ b/src/Engine/Math/Vector.h @@ -1,4 +1,6 @@ #pragma once +#define GLM_FORCE_DEPTH_ZERO_TO_ONE +#define GLM_FORCE_LEFT_HANDED #ifdef WIN32 #pragma warning(push) #pragma warning(disable : 4201)