From bbb774d9df2d6fbcc9290100436de31ff2cc4806 Mon Sep 17 00:00:00 2001 From: Dynamitos Date: Mon, 21 Oct 2024 22:12:50 +0200 Subject: [PATCH] Removing more debugging code --- res/shaders/lib/Common.slang | 2 + res/shaders/terrain/update_utils.slang | 2 +- src/Engine/Graphics/RenderPass/RenderPass.cpp | 41 +++++++++++++++++-- src/Engine/Graphics/RenderPass/RenderPass.h | 15 +++++++ 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/res/shaders/lib/Common.slang b/res/shaders/lib/Common.slang index fc09ac7..540c2d3 100644 --- a/res/shaders/lib/Common.slang +++ b/res/shaders/lib/Common.slang @@ -11,6 +11,8 @@ struct ViewParameter float4x4 inverseViewMatrix; float4x4 projectionMatrix; float4x4 inverseProjection; + float4x4 viewProjectionMatrix; + float4x4 inverseViewProjectionMatrix; float4 cameraPosition_WS; float4 cameraForward_WS; float2 screenDimensions; diff --git a/res/shaders/terrain/update_utils.slang b/res/shaders/terrain/update_utils.slang index b665e4b..cbe148b 100644 --- a/res/shaders/terrain/update_utils.slang +++ b/res/shaders/terrain/update_utils.slang @@ -62,7 +62,7 @@ int ClassifyBisector(in BisectorGeometry tri, uint depth) return FRUSTUM_CULLED; // Project the points on screen - float4x4 viewProjectionMatrix = mul(pViewParams.projectionMatrix, pViewParams.viewMatrix); + float4x4 viewProjectionMatrix = pViewParams.viewProjectionMatrix; float4 p0P = mul(viewProjectionMatrix, float4(tri.p[0], 1.0)); p0P.xy = p0P.xy / p0P.w; p0P.xy = (p0P.xy * 0.5 + 0.5); diff --git a/src/Engine/Graphics/RenderPass/RenderPass.cpp b/src/Engine/Graphics/RenderPass/RenderPass.cpp index 2177ce2..4ad7076 100644 --- a/src/Engine/Graphics/RenderPass/RenderPass.cpp +++ b/src/Engine/Graphics/RenderPass/RenderPass.cpp @@ -24,6 +24,8 @@ RenderPass::~RenderPass() {} void RenderPass::beginFrame(const Component::Camera& cam) { auto screenDim = Vector2(static_cast(viewport->getWidth()), static_cast(viewport->getHeight())); + Matrix4 cameraMatrix = cam.getViewMatrix(); + Matrix4 projectionMatrix = viewport->getProjectionMatrix(); viewParams = { .viewFrustum = { @@ -47,10 +49,12 @@ void RenderPass::beginFrame(const Component::Camera& cam) { }, }, }, - .viewMatrix = cam.getViewMatrix(), - .inverseViewMatrix = glm::inverse(cam.getViewMatrix()), - .projectionMatrix = viewport->getProjectionMatrix(), - .inverseProjection = glm::inverse(viewport->getProjectionMatrix()), + .viewMatrix = cameraMatrix, + .inverseViewMatrix = glm::inverse(cameraMatrix), + .projectionMatrix = projectionMatrix, + .inverseProjection = glm::inverse(projectionMatrix), + .viewProjectionMatrix = projectionMatrix * cameraMatrix, + .inverseViewProjectionMatrix = glm::inverse(projectionMatrix * cameraMatrix), .cameraPosition_WS = Vector4(cam.getCameraPosition(), 1), .cameraForward_WS = Vector4(cam.getCameraForward(), 1), .screenDimensions = screenDim, @@ -58,6 +62,35 @@ void RenderPass::beginFrame(const Component::Camera& cam) { .frameIndex = Gfx::getCurrentFrameIndex(), .time = static_cast(Gfx::getCurrentFrameTime()), }; + + // screen space + StaticArray corners = { + Vector4(0, 0, -1, 1), + Vector4(screenDim.x, 0, -1, 1), + Vector4(screenDim.y, 0, -1, 1), + Vector4(screenDim.x, screenDim.y, -1, 1), + }; + + for (uint32 i = 0; i < corners.size(); ++i) { + Vector2 texCoord = Vector2(corners[i].x, corners[i].y) / screenDim; + + Vector4 clip = Vector4(Vector2(texCoord.x, 1 - texCoord.y) * 2.0f - 1.0f, corners[i].z, corners[i].w); + + Vector4 world = viewParams.inverseViewProjectionMatrix * clip; + + corners[i] = world / world.w; + } + + //viewParams.viewFrustum = { + // .planes = + // { + // computePlane(cam.getCameraPosition(), Vector(corners[2]), Vector(corners[0])), + // computePlane(cam.getCameraPosition(), Vector(corners[1]), Vector(corners[3])), + // computePlane(cam.getCameraPosition(), Vector(corners[0]), Vector(corners[1])), + // computePlane(cam.getCameraPosition(), Vector(corners[3]), Vector(corners[2])), + // }, + //}; + viewParamsBuffer->rotateBuffer(sizeof(ViewParameter)); viewParamsBuffer->updateContents(0, sizeof(ViewParameter), &viewParams); viewParamsBuffer->pipelineBarrier(Gfx::SE_ACCESS_TRANSFER_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_TRANSFER_BIT, diff --git a/src/Engine/Graphics/RenderPass/RenderPass.h b/src/Engine/Graphics/RenderPass/RenderPass.h index cde9968..6663ad9 100644 --- a/src/Engine/Graphics/RenderPass/RenderPass.h +++ b/src/Engine/Graphics/RenderPass/RenderPass.h @@ -34,12 +34,27 @@ class RenderPass { struct Frustum { Plane planes[4]; }; + Plane computePlane(Vector p0, Vector p1, Vector p2) { + Plane plane; + + Vector v0 = p1 - p0; + Vector v2 = p2 - p0; + + plane.n = normalize(cross(v0, v2)); + + plane.d = dot(plane.n, p0); + + return plane; + } + struct ViewParameter { Frustum viewFrustum; Matrix4 viewMatrix; Matrix4 inverseViewMatrix; Matrix4 projectionMatrix; Matrix4 inverseProjection; + Matrix4 viewProjectionMatrix; + Matrix4 inverseViewProjectionMatrix; Vector4 cameraPosition_WS; Vector4 cameraForward_WS; Vector2 screenDimensions;