Fix GlobalSDF sampling in materials to properly read far cascades

This commit is contained in:
Wojtek Figat
2024-06-06 12:10:44 +02:00
parent 96303e57ec
commit a232dac196
7 changed files with 14 additions and 23 deletions

View File

@@ -463,6 +463,7 @@ void MaterialParameter::Bind(BindMeta& meta) const
if (GlobalSignDistanceFieldPass::Instance()->Get(meta.Buffers, bindingData))
Platform::MemoryClear(&bindingData, sizeof(bindingData));
meta.Context->BindSR(_registerIndex, bindingData.Texture ? bindingData.Texture->ViewVolume() : nullptr);
meta.Context->BindSR(_registerIndex + 1, bindingData.TextureMip ? bindingData.TextureMip->ViewVolume() : nullptr);
*((GlobalSignDistanceFieldPass::ConstantsData*)(meta.Constants.Get() + _offset)) = bindingData.Constants;
break;
}

View File

@@ -10,7 +10,7 @@
/// <summary>
/// Current materials shader version.
/// </summary>
#define MATERIAL_GRAPH_VERSION 165
#define MATERIAL_GRAPH_VERSION 166
class Material;
class GPUShader;

View File

@@ -917,6 +917,7 @@ bool GlobalSignDistanceFieldPass::Render(RenderContext& renderContext, GPUContex
}
result.Constants.Resolution = (float)resolution;
result.Constants.CascadesCount = cascadesCount;
result.Constants.Padding = Float2::Zero;
sdfData.Result = result;
return false;
}

View File

@@ -665,7 +665,7 @@ void MaterialGenerator::ProcessGroupTextures(Box* box, Node* node, Value& value)
{
auto param = findOrAddGlobalSDF();
Value worldPosition = tryGetValue(node->GetBox(1), Value(VariantType::Float3, TEXT("input.WorldPosition.xyz"))).Cast(VariantType::Float3);
value = writeLocal(VariantType::Float, String::Format(TEXT("SampleGlobalSDF({0}, {0}_Tex, {1})"), param.ShaderName, worldPosition.Value), node);
value = writeLocal(VariantType::Float, String::Format(TEXT("SampleGlobalSDF({0}, {0}_Tex, {0}_Mip, {1})"), param.ShaderName, worldPosition.Value), node);
_includes.Add(TEXT("./Flax/GlobalSignDistanceField.hlsl"));
break;
}
@@ -677,7 +677,7 @@ void MaterialGenerator::ProcessGroupTextures(Box* box, Node* node, Value& value)
auto param = findOrAddGlobalSDF();
Value worldPosition = tryGetValue(node->GetBox(1), Value(VariantType::Float3, TEXT("input.WorldPosition.xyz"))).Cast(VariantType::Float3);
auto distance = writeLocal(VariantType::Float, node);
auto gradient = writeLocal(VariantType::Float3, String::Format(TEXT("SampleGlobalSDFGradient({0}, {0}_Tex, {1}, {2})"), param.ShaderName, worldPosition.Value, distance.Value), node);
auto gradient = writeLocal(VariantType::Float3, String::Format(TEXT("SampleGlobalSDFGradient({0}, {0}_Tex, {0}_Mip, {1}, {2})"), param.ShaderName, worldPosition.Value, distance.Value), node);
_includes.Add(TEXT("./Flax/GlobalSignDistanceField.hlsl"));
gradientBox->Cache = gradient;
distanceBox->Cache = distance;

View File

@@ -1206,11 +1206,8 @@ SerializedMaterialParam* ShaderGenerator::findParam(const String& shaderName)
{
SerializedMaterialParam& param = _parameters[i];
if (param.ShaderName == shaderName)
{
return &param;
}
}
return nullptr;
}
@@ -1235,9 +1232,7 @@ SerializedMaterialParam ShaderGenerator::findOrAddTexture(const Guid& id)
{
SerializedMaterialParam& param = _parameters[i];
if (!param.IsPublic && param.Type == MaterialParameterType::Texture && param.AsGuid == id)
{
return param;
}
}
// Create
@@ -1259,9 +1254,7 @@ SerializedMaterialParam ShaderGenerator::findOrAddNormalMap(const Guid& id)
{
SerializedMaterialParam& param = _parameters[i];
if (!param.IsPublic && param.Type == MaterialParameterType::NormalMap && param.AsGuid == id)
{
return param;
}
}
// Create
@@ -1283,9 +1276,7 @@ SerializedMaterialParam ShaderGenerator::findOrAddCubeTexture(const Guid& id)
{
SerializedMaterialParam& param = _parameters[i];
if (!param.IsPublic && param.Type == MaterialParameterType::CubeTexture && param.AsGuid == id)
{
return param;
}
}
// Create
@@ -1309,9 +1300,7 @@ SerializedMaterialParam ShaderGenerator::findOrAddSceneTexture(MaterialSceneText
{
SerializedMaterialParam& param = _parameters[i];
if (!param.IsPublic && param.Type == MaterialParameterType::SceneTexture && param.AsInteger == asInt)
{
return param;
}
}
// Create
@@ -1333,9 +1322,7 @@ SerializedMaterialParam& ShaderGenerator::findOrAddTextureGroupSampler(int32 ind
{
SerializedMaterialParam& param = _parameters[i];
if (!param.IsPublic && param.Type == MaterialParameterType::TextureGroupSampler && param.AsInteger == index)
{
return param;
}
}
// Create

View File

@@ -170,8 +170,9 @@ const Char* ShaderGraphUtilities::GenerateShaderResources(TextWriterUnicode& wri
format = TEXT("Texture3D {0} : register(t{1});");
break;
case MaterialParameterType::GlobalSDF:
format = TEXT("Texture3D<float> {0}_Tex : register(t{1});");
format = TEXT("Texture3D<float> {0}_Tex : register(t{1});\nTexture3D<float> {0}_Mip : register(t{2});");
zeroOffset = false;
registers = 2;
break;
}
if (format)
@@ -179,7 +180,7 @@ const Char* ShaderGraphUtilities::GenerateShaderResources(TextWriterUnicode& wri
if (zeroOffset)
param.Offset = 0;
param.RegisterIndex = (byte)startRegister;
writer.WriteLine(format, param.ShaderName, startRegister);
writer.WriteLine(format, param.ShaderName, startRegister, startRegister + 1);
startRegister += registers;
if (param.RegisterIndex >= GPU_MAX_SR_BINDED)
{