diff --git a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp index 421baf7b1..dd9f3e31f 100644 --- a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp +++ b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp @@ -141,7 +141,6 @@ public: GPUTexture* AtlasEmissive = nullptr; GPUTexture* AtlasGBuffer0 = nullptr; GPUTexture* AtlasGBuffer1 = nullptr; - GPUTexture* AtlasGBuffer2 = nullptr; GPUTexture* AtlasLighting = nullptr; GPUBuffer* ChunksBuffer = nullptr; GPUBuffer* CulledObjectsBuffer = nullptr; @@ -195,7 +194,6 @@ public: RenderTargetPool::Release(AtlasEmissive); RenderTargetPool::Release(AtlasGBuffer0); RenderTargetPool::Release(AtlasGBuffer1); - RenderTargetPool::Release(AtlasGBuffer2); RenderTargetPool::Release(AtlasLighting); ClearObjects(); } @@ -719,7 +717,6 @@ bool GlobalSurfaceAtlasPass::Render(RenderContext& renderContext, GPUContext* co INIT_ATLAS_TEXTURE(AtlasEmissive, PixelFormat::R11G11B10_Float); INIT_ATLAS_TEXTURE(AtlasGBuffer0, GBUFFER0_FORMAT); INIT_ATLAS_TEXTURE(AtlasGBuffer1, GBUFFER1_FORMAT); - INIT_ATLAS_TEXTURE(AtlasGBuffer2, GBUFFER2_FORMAT); INIT_ATLAS_TEXTURE(AtlasLighting, PixelFormat::R11G11B10_Float); desc.Flags = GPUTextureFlags::DepthStencil | GPUTextureFlags::ShaderResource; INIT_ATLAS_TEXTURE(AtlasDepth, PixelFormat::D16_UNorm); @@ -792,12 +789,11 @@ bool GlobalSurfaceAtlasPass::Render(RenderContext& renderContext, GPUContext* co renderContextTiles.View.Prepare(renderContextTiles); GPUTextureView* depthBuffer = surfaceAtlasData.AtlasDepth->View(); - GPUTextureView* targetBuffers[4] = + GPUTextureView* targetBuffers[3] = { surfaceAtlasData.AtlasEmissive->View(), surfaceAtlasData.AtlasGBuffer0->View(), surfaceAtlasData.AtlasGBuffer1->View(), - surfaceAtlasData.AtlasGBuffer2->View(), }; context->SetRenderTarget(depthBuffer, ToSpan(targetBuffers, ARRAY_COUNT(targetBuffers))); { @@ -809,7 +805,6 @@ bool GlobalSurfaceAtlasPass::Render(RenderContext& renderContext, GPUContext* co context->Clear(targetBuffers[0], Color::Transparent); context->Clear(targetBuffers[1], Color::Transparent); context->Clear(targetBuffers[2], Color::Transparent); - context->Clear(targetBuffers[3], Color(1, 0, 0, 0)); } else { @@ -1060,8 +1055,7 @@ bool GlobalSurfaceAtlasPass::Render(RenderContext& renderContext, GPUContext* co result.Atlas[0] = surfaceAtlasData.AtlasDepth; result.Atlas[1] = surfaceAtlasData.AtlasGBuffer0; result.Atlas[2] = surfaceAtlasData.AtlasGBuffer1; - result.Atlas[3] = surfaceAtlasData.AtlasGBuffer2; - result.Atlas[4] = surfaceAtlasData.AtlasLighting; + result.Atlas[3] = surfaceAtlasData.AtlasLighting; result.Chunks = surfaceAtlasData.ChunksBuffer; result.CulledObjects = surfaceAtlasData.CulledObjectsBuffer; result.Objects = surfaceAtlasData.ObjectsBuffer.GetBuffer(); @@ -1075,7 +1069,7 @@ bool GlobalSurfaceAtlasPass::Render(RenderContext& renderContext, GPUContext* co context->SetRenderTarget(surfaceAtlasData.AtlasLighting->View()); context->BindSR(0, surfaceAtlasData.AtlasGBuffer0->View()); context->BindSR(1, surfaceAtlasData.AtlasGBuffer1->View()); - context->BindSR(2, surfaceAtlasData.AtlasGBuffer2->View()); + context->UnBindSR(2); context->BindSR(3, surfaceAtlasData.AtlasDepth->View()); context->BindSR(4, surfaceAtlasData.ObjectsBuffer.GetBuffer()->View()); context->BindSR(5, bindingDataSDF.Texture ? bindingDataSDF.Texture->ViewVolume() : nullptr); @@ -1407,7 +1401,7 @@ void GlobalSurfaceAtlasPass::RenderDebug(RenderContext& renderContext, GPUContex // Full screen - direct light context->BindSR(5, bindingData.AtlasLighting->View()); context->SetViewport(outputSize.X, outputSize.Y); - context->SetScissor(Rectangle(0, 0, outputSizeTwoThird.X, outputSize.Y)); + context->SetScissor(Rectangle(0, 0, outputSize.X, outputSize.Y)); context->DrawFullscreenTriangle(); // Color Grading and Post-Processing to improve readability in bright/dark scenes @@ -1440,14 +1434,9 @@ void GlobalSurfaceAtlasPass::RenderDebug(RenderContext& renderContext, GPUContex context->SetViewportAndScissors(Viewport(outputSizeTwoThird.X, 0, outputSizeThird.X, outputSizeThird.Y)); context->DrawFullscreenTriangle(); - // Bottom middle - normals + // Bottom right - normals context->SetState(_psDebug0); context->BindSR(5, bindingData.AtlasGBuffer1->View()); - context->SetViewportAndScissors(Viewport(outputSizeTwoThird.X, outputSizeThird.Y, outputSizeThird.X, outputSizeThird.Y)); - context->DrawFullscreenTriangle(); - - // Bottom right - roughness/metalness/ao - context->BindSR(5, bindingData.AtlasGBuffer2->View()); context->SetViewportAndScissors(Viewport(outputSizeTwoThird.X, outputSizeTwoThird.Y, outputSizeThird.X, outputSizeThird.Y)); context->DrawFullscreenTriangle(); } diff --git a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.h b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.h index 89ce6875c..ea2bc7863 100644 --- a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.h +++ b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.h @@ -30,10 +30,9 @@ public: GPUTexture* AtlasDepth; GPUTexture* AtlasGBuffer0; GPUTexture* AtlasGBuffer1; - GPUTexture* AtlasGBuffer2; GPUTexture* AtlasLighting; }; - GPUTexture* Atlas[5]; + GPUTexture* Atlas[4]; }; GPUBuffer* Chunks; GPUBuffer* CulledObjects; diff --git a/Source/Shaders/GI/GlobalSurfaceAtlas.shader b/Source/Shaders/GI/GlobalSurfaceAtlas.shader index 23ebddda8..a81383dcf 100644 --- a/Source/Shaders/GI/GlobalSurfaceAtlas.shader +++ b/Source/Shaders/GI/GlobalSurfaceAtlas.shader @@ -107,8 +107,14 @@ float4 PS_Lighting(AtlasVertexOutput input) : SV_Target float2 atlasUV = input.TileUV * tile.AtlasRectUV.zw + tile.AtlasRectUV.xy; // Load GBuffer sample from atlas - GBufferData gBufferData = (GBufferData)0; - GBufferSample gBuffer = SampleGBuffer(gBufferData, atlasUV); + float4 gBuffer0 = SAMPLE_RT(GBuffer0, atlasUV); + float4 gBuffer1 = SAMPLE_RT(GBuffer1, atlasUV); + GBufferSample gBuffer = (GBufferSample)0; + gBuffer.Normal = DecodeNormal(gBuffer1.rgb); + gBuffer.ShadingModel = (int)(gBuffer1.a * 3.999); + gBuffer.Color = gBuffer0.rgb; + gBuffer.Roughness = 1.0f; + gBuffer.AO = gBuffer0.a; BRANCH if (gBuffer.ShadingModel == SHADING_MODEL_UNLIT) { @@ -119,11 +125,6 @@ float4 PS_Lighting(AtlasVertexOutput input) : SV_Target // Reconstruct world-space position manually (from uv+depth within a tile) float tileDepth = SampleZ(atlasUV); - //float tileNear = -GLOBAL_SURFACE_ATLAS_TILE_PROJ_PLANE_OFFSET; - //float tileFar = tile.ViewBoundsSize.z + 2 * GLOBAL_SURFACE_ATLAS_TILE_PROJ_PLANE_OFFSET; - //gBufferData.ViewInfo.zw = float2(tileFar / (tileFar - tileNear), (-tileFar * tileNear) / (tileFar - tileNear) / tileFar); - //gBufferData.ViewInfo.zw = float2(1, 0); - //float tileLinearDepth = LinearizeZ(gBufferData, tileDepth); float3 tileSpacePos = float3(input.TileUV.x - 0.5f, 0.5f - input.TileUV.y, tileDepth); float3 gBufferTilePos = tileSpacePos * tile.ViewBoundsSize; float4x4 tileLocalToWorld = Inverse(tile.WorldToLocal);