Complete sdf reflections
This commit is contained in:
@@ -9,10 +9,6 @@
|
|||||||
#define MATERIAL_REFLECTIONS_SSR 1
|
#define MATERIAL_REFLECTIONS_SSR 1
|
||||||
#if MATERIAL_REFLECTIONS == MATERIAL_REFLECTIONS_SSR
|
#if MATERIAL_REFLECTIONS == MATERIAL_REFLECTIONS_SSR
|
||||||
#include "./Flax/SSR.hlsl"
|
#include "./Flax/SSR.hlsl"
|
||||||
#if USE_GLOBAL_SURFACE_ATLAS
|
|
||||||
#include "./Flax/GlobalSignDistanceField.hlsl"
|
|
||||||
#include "./Flax/GI/GlobalSurfaceAtlas.hlsl"
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#include "./Flax/Lighting.hlsl"
|
#include "./Flax/Lighting.hlsl"
|
||||||
@@ -31,15 +27,6 @@ LightData LocalLights[MAX_LOCAL_LIGHTS];
|
|||||||
TextureCube EnvProbe : register(t__SRV__);
|
TextureCube EnvProbe : register(t__SRV__);
|
||||||
TextureCube SkyLightTexture : register(t__SRV__);
|
TextureCube SkyLightTexture : register(t__SRV__);
|
||||||
Texture2DArray DirectionalLightShadowMap : register(t__SRV__);
|
Texture2DArray DirectionalLightShadowMap : register(t__SRV__);
|
||||||
#if USE_GLOBAL_SURFACE_ATLAS
|
|
||||||
Texture3D<float> GlobalSDFTex : register(t__SRV__);
|
|
||||||
Texture3D<float> GlobalSDFMip : register(t__SRV__);
|
|
||||||
ByteAddressBuffer GlobalSurfaceAtlasChunks : register(t__SRV__);
|
|
||||||
ByteAddressBuffer RWGlobalSurfaceAtlasCulledObjects : register(t__SRV__);
|
|
||||||
Buffer<float4> GlobalSurfaceAtlasObjects : register(t__SRV__);
|
|
||||||
Texture2D GlobalSurfaceAtlasDepth : register(t__SRV__);
|
|
||||||
Texture2D GlobalSurfaceAtlasTex : register(t__SRV__);
|
|
||||||
#endif
|
|
||||||
@4// Forward Shading: Utilities
|
@4// Forward Shading: Utilities
|
||||||
DECLARE_LIGHTSHADOWDATA_ACCESS(DirectionalLightShadow);
|
DECLARE_LIGHTSHADOWDATA_ACCESS(DirectionalLightShadow);
|
||||||
@5// Forward Shading: Shaders
|
@5// Forward Shading: Shaders
|
||||||
@@ -82,7 +69,7 @@ void PS_Forward(
|
|||||||
gBuffer.Color = material.Color;
|
gBuffer.Color = material.Color;
|
||||||
gBuffer.Specular = material.Specular;
|
gBuffer.Specular = material.Specular;
|
||||||
gBuffer.AO = material.AO;
|
gBuffer.AO = material.AO;
|
||||||
gBuffer.ViewPos = mul(float4(materialInput.WorldPosition, 1), ViewMatrix).xyz;
|
gBuffer.ViewPos = ViewPos;
|
||||||
#if MATERIAL_SHADING_MODEL == SHADING_MODEL_SUBSURFACE
|
#if MATERIAL_SHADING_MODEL == SHADING_MODEL_SUBSURFACE
|
||||||
gBuffer.CustomData = float4(material.SubsurfaceColor, material.Opacity);
|
gBuffer.CustomData = float4(material.SubsurfaceColor, material.Opacity);
|
||||||
#elif MATERIAL_SHADING_MODEL == SHADING_MODEL_FOLIAGE
|
#elif MATERIAL_SHADING_MODEL == SHADING_MODEL_FOLIAGE
|
||||||
@@ -148,21 +135,12 @@ void PS_Forward(
|
|||||||
if (hit.z < 0.9f)
|
if (hit.z < 0.9f)
|
||||||
{
|
{
|
||||||
// Don't use temporal effect in forward pass
|
// Don't use temporal effect in forward pass
|
||||||
float3 reflectWS = ScreenSpaceReflectionDirection(screenUV, gBuffer, gBufferData.ViewPos);
|
float3 reflectWS = ScreenSpaceReflectionDirection(screenUV, gBuffer, ViewPos);
|
||||||
|
float4 surfaceAtlas;
|
||||||
GlobalSDFTrace sdfTrace;
|
|
||||||
float maxDistance = 100000;
|
|
||||||
float selfOcclusionBias = GlobalSDF.CascadeVoxelSize[0];
|
|
||||||
sdfTrace.Init(gBuffer.WorldPos + gBuffer.Normal * selfOcclusionBias, reflectWS, 0.0f, maxDistance);
|
|
||||||
GlobalSDFHit sdfHit = RayTraceGlobalSDF(GlobalSDF, GlobalSDFTex, GlobalSDFMip, sdfTrace);
|
|
||||||
if (sdfHit.IsHit())
|
|
||||||
{
|
|
||||||
float3 hitPosition = sdfHit.GetHitPosition(sdfTrace);
|
|
||||||
float surfaceThreshold = GetGlobalSurfaceAtlasThreshold(GlobalSDF, sdfHit);
|
|
||||||
float4 surfaceAtlas = SampleGlobalSurfaceAtlas(GlobalSurfaceAtlas, GlobalSurfaceAtlasChunks, RWGlobalSurfaceAtlasCulledObjects, GlobalSurfaceAtlasObjects, GlobalSurfaceAtlasDepth, GlobalSurfaceAtlasTex, hitPosition, -reflectWS, surfaceThreshold);
|
|
||||||
|
|
||||||
|
if(TraceSDFSoftwareReflections(gBuffer, reflectWS, surfaceAtlas)){
|
||||||
float3 screenColor = sceneColorTexture.SampleLevel(SamplerPointClamp, hit.xy, 0).rgb;
|
float3 screenColor = sceneColorTexture.SampleLevel(SamplerPointClamp, hit.xy, 0).rgb;
|
||||||
reflections = lerp(surfaceAtlas, float4(screenColor, 1), hit.z);
|
reflections = lerp(2 * surfaceAtlas, float4(screenColor, 1), hit.z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,6 +152,7 @@ void PS_Forward(
|
|||||||
|
|
||||||
// Add lighting (apply ambient occlusion)
|
// Add lighting (apply ambient occlusion)
|
||||||
output.rgb += light.rgb * gBuffer.AO;
|
output.rgb += light.rgb * gBuffer.AO;
|
||||||
|
output =
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
|
@0// SDF Reflections: Defines
|
||||||
|
#define USE_GLOBAL_SURFACE_ATLAS 1
|
||||||
|
@1// SDF Reflections: Includes
|
||||||
|
#include "./Flax/GlobalSignDistanceField.hlsl"
|
||||||
|
#include "./Flax/GI/GlobalSurfaceAtlas.hlsl"
|
||||||
|
@2// SDF Reflections: Constants
|
||||||
|
GlobalSDFData GlobalSDF;
|
||||||
|
GlobalSurfaceAtlasData GlobalSurfaceAtlas;
|
||||||
|
@3// SDF Reflections: Resources
|
||||||
|
Texture3D<float> GlobalSDFTex : register(t__SRV__);
|
||||||
|
Texture3D<float> GlobalSDFMip : register(t__SRV__);
|
||||||
|
ByteAddressBuffer GlobalSurfaceAtlasChunks : register(t__SRV__);
|
||||||
|
ByteAddressBuffer RWGlobalSurfaceAtlasCulledObjects : register(t__SRV__);
|
||||||
|
Buffer<float4> GlobalSurfaceAtlasObjects : register(t__SRV__);
|
||||||
|
Texture2D GlobalSurfaceAtlasDepth : register(t__SRV__);
|
||||||
|
Texture2D GlobalSurfaceAtlasTex : register(t__SRV__);
|
||||||
|
@4// SDF Reflections: Utilities
|
||||||
|
bool TraceSDFSoftwareReflections(GBufferSample gBuffer, float3 reflectWS, out float4 surfaceAtlas)
|
||||||
|
{
|
||||||
|
GlobalSDFTrace sdfTrace;
|
||||||
|
float maxDistance = 100000;
|
||||||
|
float selfOcclusionBias = GlobalSDF.CascadeVoxelSize[0];
|
||||||
|
sdfTrace.Init(gBuffer.WorldPos + gBuffer.Normal * selfOcclusionBias, reflectWS, 0.0f, maxDistance);
|
||||||
|
GlobalSDFHit sdfHit = RayTraceGlobalSDF(GlobalSDF, GlobalSDFTex, GlobalSDFMip, sdfTrace);
|
||||||
|
if (sdfHit.IsHit())
|
||||||
|
{
|
||||||
|
float3 hitPosition = sdfHit.GetHitPosition(sdfTrace);
|
||||||
|
float surfaceThreshold = GetGlobalSurfaceAtlasThreshold(GlobalSDF, sdfHit);
|
||||||
|
surfaceAtlas = SampleGlobalSurfaceAtlas(GlobalSurfaceAtlas, GlobalSurfaceAtlasChunks, RWGlobalSurfaceAtlasCulledObjects, GlobalSurfaceAtlasObjects, GlobalSurfaceAtlasDepth, GlobalSurfaceAtlasTex, hitPosition, -reflectWS, surfaceThreshold);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@5// SDF Reflections: Shaders
|
||||||
@@ -53,6 +53,8 @@ void ForwardMaterialShader::Bind(BindParameters& params)
|
|||||||
// Setup features
|
// Setup features
|
||||||
if ((_info.FeaturesFlags & MaterialFeaturesFlags::GlobalIllumination) != MaterialFeaturesFlags::None)
|
if ((_info.FeaturesFlags & MaterialFeaturesFlags::GlobalIllumination) != MaterialFeaturesFlags::None)
|
||||||
GlobalIlluminationFeature::Bind(params, cb, srv);
|
GlobalIlluminationFeature::Bind(params, cb, srv);
|
||||||
|
if ((_info.FeaturesFlags & MaterialFeaturesFlags::ScreenSpaceReflections) != MaterialFeaturesFlags::None)
|
||||||
|
SDFReflectionsFeature::Bind(params, cb, srv);
|
||||||
ForwardShadingFeature::Bind(params, cb, srv);
|
ForwardShadingFeature::Bind(params, cb, srv);
|
||||||
|
|
||||||
// Setup parameters
|
// Setup parameters
|
||||||
|
|||||||
@@ -100,15 +100,6 @@ void ForwardShadingFeature::Bind(MaterialShader::BindParameters& params, Span<by
|
|||||||
params.GPUContext->UnBindSR(envProbeShaderRegisterIndex);
|
params.GPUContext->UnBindSR(envProbeShaderRegisterIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bind sdf resources if using software reflections
|
|
||||||
if (!GlobalSignDistanceFieldPass::Instance()->Render(params.RenderContext, params.GPUContext, bindingDataSDF) &&
|
|
||||||
!GlobalSurfaceAtlasPass::Instance()->Render(params.RenderContext, params.GPUContext, bindingDataSurfaceAtlas))
|
|
||||||
{
|
|
||||||
useGlobalSurfaceAtlas = true;
|
|
||||||
data.GlobalSDF = bindingDataSDF.Constants;
|
|
||||||
data.GlobalSurfaceAtlas = bindingDataSurfaceAtlas.Constants;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set local lights
|
// Set local lights
|
||||||
data.LocalLightsCount = 0;
|
data.LocalLightsCount = 0;
|
||||||
const BoundingSphere objectBounds(drawCall.ObjectPosition, drawCall.ObjectRadius);
|
const BoundingSphere objectBounds(drawCall.ObjectPosition, drawCall.ObjectRadius);
|
||||||
@@ -143,13 +134,13 @@ bool LightmapFeature::Bind(MaterialShader::BindParameters& params, Span<byte>& c
|
|||||||
|
|
||||||
const bool useLightmap = EnumHasAnyFlags(params.RenderContext.View.Flags, ViewFlags::GI)
|
const bool useLightmap = EnumHasAnyFlags(params.RenderContext.View.Flags, ViewFlags::GI)
|
||||||
#if USE_EDITOR
|
#if USE_EDITOR
|
||||||
&& EnableLightmapsUsage
|
&& EnableLightmapsUsage
|
||||||
#endif
|
#endif
|
||||||
&& drawCall.Surface.Lightmap != nullptr;
|
&& drawCall.Surface.Lightmap != nullptr;
|
||||||
if (useLightmap)
|
if (useLightmap)
|
||||||
{
|
{
|
||||||
// Bind lightmap textures
|
// Bind lightmap textures
|
||||||
GPUTexture *lightmap0, *lightmap1, *lightmap2;
|
GPUTexture* lightmap0, * lightmap1, * lightmap2;
|
||||||
drawCall.Features.Lightmap->GetTextures(&lightmap0, &lightmap1, &lightmap2);
|
drawCall.Features.Lightmap->GetTextures(&lightmap0, &lightmap1, &lightmap2);
|
||||||
params.GPUContext->BindSR(srv + 0, lightmap0);
|
params.GPUContext->BindSR(srv + 0, lightmap0);
|
||||||
params.GPUContext->BindSR(srv + 1, lightmap1);
|
params.GPUContext->BindSR(srv + 1, lightmap1);
|
||||||
@@ -207,6 +198,61 @@ bool GlobalIlluminationFeature::Bind(MaterialShader::BindParameters& params, Spa
|
|||||||
return useGI;
|
return useGI;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SDFReflectionsFeature::Bind(MaterialShader::BindParameters& params, Span<byte>& cb, int32& srv)
|
||||||
|
{
|
||||||
|
auto& data = *(Data*)cb.Get();
|
||||||
|
ASSERT_LOW_LAYER(cb.Length() >= sizeof(Data));
|
||||||
|
|
||||||
|
bool useSDFReflections = false;
|
||||||
|
if (EnumHasAnyFlags(params.RenderContext.View.Flags, ViewFlags::Reflections))
|
||||||
|
{
|
||||||
|
switch (params.RenderContext.List->Settings.ScreenSpaceReflections.TraceMode)
|
||||||
|
{
|
||||||
|
case ReflectionsTraceMode::SoftwareTracing:
|
||||||
|
{
|
||||||
|
GlobalSignDistanceFieldPass::BindingData bindingDataSDF;
|
||||||
|
GlobalSurfaceAtlasPass::BindingData bindingDataSurfaceAtlas;
|
||||||
|
|
||||||
|
if (!GlobalSignDistanceFieldPass::Instance()->Get(params.RenderContext.Buffers, bindingDataSDF) &&
|
||||||
|
!GlobalSurfaceAtlasPass::Instance()->Get(params.RenderContext.Buffers, bindingDataSurfaceAtlas))
|
||||||
|
{
|
||||||
|
useSDFReflections = true;
|
||||||
|
|
||||||
|
// Bind DDGI data
|
||||||
|
data.GlobalSDF = bindingDataSDF.Constants;
|
||||||
|
data.GlobalSurfaceAtlas = bindingDataSurfaceAtlas.Constants;
|
||||||
|
|
||||||
|
params.GPUContext->BindSR(srv + 0, bindingDataSDF.Texture ? bindingDataSDF.Texture->ViewVolume() : nullptr);
|
||||||
|
params.GPUContext->BindSR(srv + 1, bindingDataSDF.TextureMip ? bindingDataSDF.TextureMip->ViewVolume() : nullptr);
|
||||||
|
params.GPUContext->BindSR(srv + 2, bindingDataSurfaceAtlas.Chunks ? bindingDataSurfaceAtlas.Chunks->View() : nullptr);
|
||||||
|
params.GPUContext->BindSR(srv + 3, bindingDataSurfaceAtlas.CulledObjects ? bindingDataSurfaceAtlas.CulledObjects->View() : nullptr);
|
||||||
|
params.GPUContext->BindSR(srv + 4, bindingDataSurfaceAtlas.Objects ? bindingDataSurfaceAtlas.Objects->View() : nullptr);
|
||||||
|
params.GPUContext->BindSR(srv + 5, bindingDataSurfaceAtlas.AtlasDepth->View());
|
||||||
|
params.GPUContext->BindSR(srv + 6, bindingDataSurfaceAtlas.AtlasLighting->View());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!useSDFReflections)
|
||||||
|
{
|
||||||
|
data.GlobalSDF.CascadesCount = 0;
|
||||||
|
// Unbind SRVs to prevent issues
|
||||||
|
params.GPUContext->UnBindSR(srv + 0);
|
||||||
|
params.GPUContext->UnBindSR(srv + 1);
|
||||||
|
params.GPUContext->UnBindSR(srv + 2);
|
||||||
|
params.GPUContext->UnBindSR(srv + 3);
|
||||||
|
params.GPUContext->UnBindSR(srv + 4);
|
||||||
|
params.GPUContext->UnBindSR(srv + 5);
|
||||||
|
params.GPUContext->UnBindSR(srv + 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
cb = Span<byte>(cb.Get() + sizeof(Data), cb.Length() - sizeof(Data));
|
||||||
|
srv += SRVs;
|
||||||
|
return useSDFReflections;
|
||||||
|
}
|
||||||
|
|
||||||
#if USE_EDITOR
|
#if USE_EDITOR
|
||||||
|
|
||||||
void ForwardShadingFeature::Generate(GeneratorData& data)
|
void ForwardShadingFeature::Generate(GeneratorData& data)
|
||||||
@@ -234,6 +280,11 @@ void GlobalIlluminationFeature::Generate(GeneratorData& data)
|
|||||||
data.Template = TEXT("Features/GlobalIllumination.hlsl");
|
data.Template = TEXT("Features/GlobalIllumination.hlsl");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SDFReflectionsFeature::Generate(GeneratorData& data)
|
||||||
|
{
|
||||||
|
data.Template = TEXT("Features/SDFReflections.hlsl");
|
||||||
|
}
|
||||||
|
|
||||||
void DistortionFeature::Generate(GeneratorData& data)
|
void DistortionFeature::Generate(GeneratorData& data)
|
||||||
{
|
{
|
||||||
data.Template = TEXT("Features/Distortion.hlsl");
|
data.Template = TEXT("Features/Distortion.hlsl");
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
#include "Engine/Core/Math/Rectangle.h"
|
#include "Engine/Core/Math/Rectangle.h"
|
||||||
#include "Engine/Core/Types/Span.h"
|
#include "Engine/Core/Types/Span.h"
|
||||||
#include "Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.h"
|
#include "Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.h"
|
||||||
|
#include "Engine/Renderer/GlobalSignDistanceFieldPass.h"
|
||||||
|
#include "Engine/Renderer/GI/GlobalSurfaceAtlasPass.h"
|
||||||
|
|
||||||
// Material shader features are plugin-based functionalities that are reusable between different material domains.
|
// Material shader features are plugin-based functionalities that are reusable between different material domains.
|
||||||
struct MaterialShaderFeature
|
struct MaterialShaderFeature
|
||||||
@@ -91,6 +93,25 @@ struct GlobalIlluminationFeature : MaterialShaderFeature
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Material shader feature that adds SDF Reflections feature (software reflections).
|
||||||
|
struct SDFReflectionsFeature : MaterialShaderFeature
|
||||||
|
{
|
||||||
|
enum { SRVs = 7 };
|
||||||
|
|
||||||
|
PACK_STRUCT(struct Data
|
||||||
|
{
|
||||||
|
GlobalSignDistanceFieldPass::ConstantsData GlobalSDF;
|
||||||
|
GlobalSurfaceAtlasPass::ConstantsData GlobalSurfaceAtlas;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static bool Bind(MaterialShader::BindParameters& params, Span<byte>& cb, int32& srv);
|
||||||
|
#if USE_EDITOR
|
||||||
|
static void Generate(GeneratorData& data);
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
// Material shader feature that adds distortion vectors rendering pass.
|
// Material shader feature that adds distortion vectors rendering pass.
|
||||||
struct DistortionFeature : MaterialShaderFeature
|
struct DistortionFeature : MaterialShaderFeature
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -360,6 +360,17 @@ void GlobalSurfaceAtlasPass::Dispose()
|
|||||||
_shader = nullptr;
|
_shader = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GlobalSurfaceAtlasPass::Get(const RenderBuffers* buffers, BindingData& result)
|
||||||
|
{
|
||||||
|
auto* surfaceAtlasData = buffers ? buffers->FindCustomBuffer<GlobalSurfaceAtlasCustomBuffer>(TEXT("GlobalSurfaceAtlas")) : nullptr;
|
||||||
|
if (surfaceAtlasData && surfaceAtlasData->LastFrameUsed + 1 >= Engine::FrameCount) // Allow to use Surface Atlas from the previous frame (not used currently)
|
||||||
|
{
|
||||||
|
result = surfaceAtlasData->Result;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool GlobalSurfaceAtlasPass::Render(RenderContext& renderContext, GPUContext* context, BindingData& result)
|
bool GlobalSurfaceAtlasPass::Render(RenderContext& renderContext, GPUContext* context, BindingData& result)
|
||||||
{
|
{
|
||||||
// Skip if not supported
|
// Skip if not supported
|
||||||
|
|||||||
@@ -65,6 +65,14 @@ private:
|
|||||||
void* _currentActorObject;
|
void* _currentActorObject;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the Global Surface Atlas (only if enabled in Graphics Settings).
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="buffers">The rendering context buffers.</param>
|
||||||
|
/// <param name="result">The result Global Surface Atlas data for binding to the shaders.</param>
|
||||||
|
/// <returns>True if there is no valid Global Surface Atlas rendered during this frame, otherwise false.</returns>
|
||||||
|
bool Get(const RenderBuffers* buffers, BindingData& result);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Renders the Global Surface Atlas.
|
/// Renders the Global Surface Atlas.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -199,6 +199,8 @@ bool MaterialGenerator::Generate(WriteStream& source, MaterialInfo& materialInfo
|
|||||||
ADD_FEATURE(DistortionFeature);
|
ADD_FEATURE(DistortionFeature);
|
||||||
if (materialInfo.BlendMode != MaterialBlendMode::Opaque && EnumHasAnyFlags(materialInfo.FeaturesFlags, MaterialFeaturesFlags::GlobalIllumination))
|
if (materialInfo.BlendMode != MaterialBlendMode::Opaque && EnumHasAnyFlags(materialInfo.FeaturesFlags, MaterialFeaturesFlags::GlobalIllumination))
|
||||||
ADD_FEATURE(GlobalIlluminationFeature);
|
ADD_FEATURE(GlobalIlluminationFeature);
|
||||||
|
if (materialInfo.BlendMode != MaterialBlendMode::Opaque && EnumHasAnyFlags(materialInfo.FeaturesFlags, MaterialFeaturesFlags::ScreenSpaceReflections))
|
||||||
|
ADD_FEATURE(SDFReflectionsFeature);
|
||||||
if (materialInfo.BlendMode != MaterialBlendMode::Opaque)
|
if (materialInfo.BlendMode != MaterialBlendMode::Opaque)
|
||||||
ADD_FEATURE(ForwardShadingFeature);
|
ADD_FEATURE(ForwardShadingFeature);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -150,8 +150,8 @@ float4 PS_RayTracePass(Quad_VS2PS input) : SV_Target0
|
|||||||
float surfaceThreshold = GetGlobalSurfaceAtlasThreshold(GlobalSDF, sdfHit);
|
float surfaceThreshold = GetGlobalSurfaceAtlasThreshold(GlobalSDF, sdfHit);
|
||||||
float4 surfaceAtlas = SampleGlobalSurfaceAtlas(GlobalSurfaceAtlas, GlobalSurfaceAtlasChunks, RWGlobalSurfaceAtlasCulledObjects, GlobalSurfaceAtlasObjects, GlobalSurfaceAtlasDepth, GlobalSurfaceAtlasTex, hitPosition, -reflectWS, surfaceThreshold);
|
float4 surfaceAtlas = SampleGlobalSurfaceAtlas(GlobalSurfaceAtlas, GlobalSurfaceAtlasChunks, RWGlobalSurfaceAtlasCulledObjects, GlobalSurfaceAtlasObjects, GlobalSurfaceAtlasDepth, GlobalSurfaceAtlasTex, hitPosition, -reflectWS, surfaceThreshold);
|
||||||
// Now the sdf reflection part is significantly darker than the screen space part
|
// Now the sdf reflection part is significantly darker than the screen space part
|
||||||
// TODO: Maybe multiply surfaceAtlas by a constant to make it brighter
|
// TODO: Maybe multiply surfaceAtlas by a constant to make it brighter, adding 2* looks fine
|
||||||
result = lerp(surfaceAtlas, float4(result.rgb, 1), result.a);
|
result = lerp(2 * surfaceAtlas, float4(result.rgb, 1), result.a);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user