@@ -10,7 +10,7 @@
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Current materials shader version.
|
/// Current materials shader version.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
#define MATERIAL_GRAPH_VERSION 174
|
#define MATERIAL_GRAPH_VERSION 175
|
||||||
|
|
||||||
class Material;
|
class Material;
|
||||||
class GPUShader;
|
class GPUShader;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "MaterialShaderFeatures.h"
|
#include "MaterialShaderFeatures.h"
|
||||||
#include "Engine/Graphics/RenderTask.h"
|
#include "Engine/Graphics/RenderTask.h"
|
||||||
|
#include "Engine/Graphics/RenderBuffers.h"
|
||||||
#include "Engine/Graphics/Textures/GPUTexture.h"
|
#include "Engine/Graphics/Textures/GPUTexture.h"
|
||||||
#include "Engine/Renderer/RenderList.h"
|
#include "Engine/Renderer/RenderList.h"
|
||||||
#include "Engine/Renderer/ShadowsPass.h"
|
#include "Engine/Renderer/ShadowsPass.h"
|
||||||
@@ -24,18 +25,27 @@ void ForwardShadingFeature::Bind(MaterialShader::BindParameters& params, Span<by
|
|||||||
const int32 skyLightShaderRegisterIndex = srv + 1;
|
const int32 skyLightShaderRegisterIndex = srv + 1;
|
||||||
const int32 shadowsBufferRegisterIndex = srv + 2;
|
const int32 shadowsBufferRegisterIndex = srv + 2;
|
||||||
const int32 shadowMapShaderRegisterIndex = srv + 3;
|
const int32 shadowMapShaderRegisterIndex = srv + 3;
|
||||||
|
const int32 volumetricFogTextureRegisterIndex = srv + 4;
|
||||||
const bool canUseShadow = view.Pass != DrawPass::Depth;
|
const bool canUseShadow = view.Pass != DrawPass::Depth;
|
||||||
|
|
||||||
// Set fog input
|
// Set fog input
|
||||||
|
GPUTextureView* volumetricFogTexture = nullptr;
|
||||||
if (cache->Fog)
|
if (cache->Fog)
|
||||||
{
|
{
|
||||||
cache->Fog->GetExponentialHeightFogData(view, data.ExponentialHeightFog);
|
cache->Fog->GetExponentialHeightFogData(view, data.ExponentialHeightFog);
|
||||||
|
VolumetricFogOptions volumetricFog;
|
||||||
|
cache->Fog->GetVolumetricFogOptions(volumetricFog);
|
||||||
|
if (volumetricFog.UseVolumetricFog() && params.RenderContext.Buffers->VolumetricFog)
|
||||||
|
volumetricFogTexture = params.RenderContext.Buffers->VolumetricFog->ViewVolume();
|
||||||
|
else
|
||||||
|
data.ExponentialHeightFog.VolumetricFogMaxDistance = -1.0f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data.ExponentialHeightFog.FogMinOpacity = 1.0f;
|
data.ExponentialHeightFog.FogMinOpacity = 1.0f;
|
||||||
data.ExponentialHeightFog.ApplyDirectionalInscattering = 0.0f;
|
data.ExponentialHeightFog.ApplyDirectionalInscattering = 0.0f;
|
||||||
}
|
}
|
||||||
|
params.GPUContext->BindSR(volumetricFogTextureRegisterIndex, volumetricFogTexture);
|
||||||
|
|
||||||
// Set directional light input
|
// Set directional light input
|
||||||
if (cache->DirectionalLights.HasItems())
|
if (cache->DirectionalLights.HasItems())
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ struct ForwardShadingFeature : MaterialShaderFeature
|
|||||||
{
|
{
|
||||||
enum { MaxLocalLights = 4 };
|
enum { MaxLocalLights = 4 };
|
||||||
|
|
||||||
enum { SRVs = 4 };
|
enum { SRVs = 5 };
|
||||||
|
|
||||||
PACK_STRUCT(struct Data
|
PACK_STRUCT(struct Data
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -92,4 +92,9 @@ float4 GetExponentialHeightFog(ExponentialHeightFogData exponentialHeightFog, fl
|
|||||||
return GetExponentialHeightFog(exponentialHeightFog, posWS, camWS, skipDistance, distance(posWS, camWS));
|
return GetExponentialHeightFog(exponentialHeightFog, posWS, camWS, skipDistance, distance(posWS, camWS));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float4 CombineVolumetricFog(float4 fog, float4 volumetricFog)
|
||||||
|
{
|
||||||
|
return float4(volumetricFog.rgb + fog.rgb * volumetricFog.a, volumetricFog.a * fog.a);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ float4 PS_Fog(Quad_VS2PS input) : SV_Target0
|
|||||||
#if VOLUMETRIC_FOG
|
#if VOLUMETRIC_FOG
|
||||||
// Sample volumetric fog and mix it in
|
// Sample volumetric fog and mix it in
|
||||||
float4 volumetricFog = IntegratedLightScattering.SampleLevel(SamplerLinearClamp, volumeUV, 0);
|
float4 volumetricFog = IntegratedLightScattering.SampleLevel(SamplerLinearClamp, volumeUV, 0);
|
||||||
fog = float4(volumetricFog.rgb + fog.rgb * volumetricFog.a, volumetricFog.a * fog.a);
|
fog = CombineVolumetricFog(fog, volumetricFog);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return fog;
|
return fog;
|
||||||
|
|||||||
Reference in New Issue
Block a user