From a5b00fa718c9ce7a4e01ef84f5618ad2abcc3a0b Mon Sep 17 00:00:00 2001 From: ExMatics HydrogenC <33123710+HydrogenC@users.noreply.github.com> Date: Wed, 19 Jun 2024 10:58:27 +0800 Subject: [PATCH] Resolve problems in code review --- .../MaterialTemplates/Features/ForwardShading.hlsl | 4 ++-- .../MaterialTemplates/Features/SDFReflections.hlsl | 2 +- .../Graphics/Materials/ForwardMaterialShader.cpp | 7 ++++--- .../Tools/MaterialGenerator/MaterialGenerator.cpp | 11 +++++++---- Source/Shaders/GBufferCommon.hlsl | 1 + Source/Shaders/SSR.shader | 2 +- 6 files changed, 16 insertions(+), 11 deletions(-) diff --git a/Content/Editor/MaterialTemplates/Features/ForwardShading.hlsl b/Content/Editor/MaterialTemplates/Features/ForwardShading.hlsl index 914173c03..dc866c1ea 100644 --- a/Content/Editor/MaterialTemplates/Features/ForwardShading.hlsl +++ b/Content/Editor/MaterialTemplates/Features/ForwardShading.hlsl @@ -67,8 +67,8 @@ void PS_Forward( gBuffer.Color = material.Color; gBuffer.Specular = material.Specular; gBuffer.AO = material.AO; - // gBuffer.ViewPos is the view position in WORLD SPACE - gBuffer.ViewPos = ViewPos; + // gBuffer.ViewPos is the view space position of the pixel + gBuffer.ViewPos = mul(float4(materialInput.WorldPosition, 1), ViewMatrix).xyz; #if MATERIAL_SHADING_MODEL == SHADING_MODEL_SUBSURFACE gBuffer.CustomData = float4(material.SubsurfaceColor, material.Opacity); #elif MATERIAL_SHADING_MODEL == SHADING_MODEL_FOLIAGE diff --git a/Content/Editor/MaterialTemplates/Features/SDFReflections.hlsl b/Content/Editor/MaterialTemplates/Features/SDFReflections.hlsl index be3e6c831..a7177e686 100644 --- a/Content/Editor/MaterialTemplates/Features/SDFReflections.hlsl +++ b/Content/Editor/MaterialTemplates/Features/SDFReflections.hlsl @@ -20,7 +20,7 @@ Texture2D GlobalSurfaceAtlasTex : register(t__SRV__); bool TraceSDFSoftwareReflections(GBufferSample gBuffer, float3 reflectWS, out float4 surfaceAtlas) { GlobalSDFTrace sdfTrace; - float maxDistance = 100000; + float maxDistance = GLOBAL_SDF_WORLD_SIZE; float selfOcclusionBias = GlobalSDF.CascadeVoxelSize[0]; sdfTrace.Init(gBuffer.WorldPos + gBuffer.Normal * selfOcclusionBias, reflectWS, 0.0f, maxDistance); GlobalSDFHit sdfHit = RayTraceGlobalSDF(GlobalSDF, GlobalSDFTex, GlobalSDFMip, sdfTrace); diff --git a/Source/Engine/Graphics/Materials/ForwardMaterialShader.cpp b/Source/Engine/Graphics/Materials/ForwardMaterialShader.cpp index 2b4237190..fd9568bcf 100644 --- a/Source/Engine/Graphics/Materials/ForwardMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/ForwardMaterialShader.cpp @@ -51,10 +51,11 @@ void ForwardMaterialShader::Bind(BindParameters& params) int32 srv = 2; // Setup features - if ((_info.FeaturesFlags & MaterialFeaturesFlags::GlobalIllumination) != MaterialFeaturesFlags::None) + if ((_info.FeaturesFlags & MaterialFeaturesFlags::GlobalIllumination) != MaterialFeaturesFlags::None) { GlobalIlluminationFeature::Bind(params, cb, srv); - if ((_info.FeaturesFlags & MaterialFeaturesFlags::ScreenSpaceReflections) != MaterialFeaturesFlags::None) - SDFReflectionsFeature::Bind(params, cb, srv); + if ((_info.FeaturesFlags & MaterialFeaturesFlags::ScreenSpaceReflections) != MaterialFeaturesFlags::None) + SDFReflectionsFeature::Bind(params, cb, srv); + } ForwardShadingFeature::Bind(params, cb, srv); // Setup parameters diff --git a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp index 87e73871f..bff70e709 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.cpp @@ -197,10 +197,13 @@ bool MaterialGenerator::Generate(WriteStream& source, MaterialInfo& materialInfo ADD_FEATURE(DeferredShadingFeature); if (materialInfo.BlendMode != MaterialBlendMode::Opaque && (materialInfo.FeaturesFlags & MaterialFeaturesFlags::DisableDistortion) == MaterialFeaturesFlags::None) ADD_FEATURE(DistortionFeature); - if (materialInfo.BlendMode != MaterialBlendMode::Opaque && EnumHasAnyFlags(materialInfo.FeaturesFlags, MaterialFeaturesFlags::GlobalIllumination)) - ADD_FEATURE(GlobalIlluminationFeature); - if (materialInfo.BlendMode != MaterialBlendMode::Opaque && EnumHasAnyFlags(materialInfo.FeaturesFlags, MaterialFeaturesFlags::ScreenSpaceReflections)) - ADD_FEATURE(SDFReflectionsFeature); + if (materialInfo.BlendMode != MaterialBlendMode::Opaque && EnumHasAnyFlags(materialInfo.FeaturesFlags, MaterialFeaturesFlags::GlobalIllumination)) { + ADD_FEATURE(GlobalIlluminationFeature); + + // SDF Reflections is only valid when both GI and SSR is enabled + if (materialInfo.BlendMode != MaterialBlendMode::Opaque && EnumHasAnyFlags(materialInfo.FeaturesFlags, MaterialFeaturesFlags::ScreenSpaceReflections)) + ADD_FEATURE(SDFReflectionsFeature); + } if (materialInfo.BlendMode != MaterialBlendMode::Opaque) ADD_FEATURE(ForwardShadingFeature); break; diff --git a/Source/Shaders/GBufferCommon.hlsl b/Source/Shaders/GBufferCommon.hlsl index 88a6c3688..27095f000 100644 --- a/Source/Shaders/GBufferCommon.hlsl +++ b/Source/Shaders/GBufferCommon.hlsl @@ -14,6 +14,7 @@ struct GBufferSample float Metalness; float3 Color; float Specular; + // View space position of pixel, DIFFERENT FROM GBufferData.ViewPos float3 ViewPos; float AO; int ShadingModel; diff --git a/Source/Shaders/SSR.shader b/Source/Shaders/SSR.shader index 4e3a46e51..3aa3cbc60 100644 --- a/Source/Shaders/SSR.shader +++ b/Source/Shaders/SSR.shader @@ -140,7 +140,7 @@ float4 PS_RayTracePass(Quad_VS2PS input) : SV_Target0 float3 reflectWS = ScreenSpaceReflectionDirection(input.TexCoord, gBuffer, gBufferData.ViewPos, TemporalEffect, TemporalTime, BRDFBias); GlobalSDFTrace sdfTrace; - float maxDistance = 100000; + float maxDistance = GLOBAL_SDF_WORLD_SIZE; float selfOcclusionBias = GlobalSDF.CascadeVoxelSize[0]; sdfTrace.Init(gBuffer.WorldPos + gBuffer.Normal * selfOcclusionBias, reflectWS, 0.0f, maxDistance); GlobalSDFHit sdfHit = RayTraceGlobalSDF(GlobalSDF, GlobalSDFTex, GlobalSDFMip, sdfTrace);