Add **Sample Global SDF** node to materials

This commit is contained in:
Wojciech Figat
2022-03-25 10:09:52 +01:00
parent dff1b37a3b
commit b847b9ccba
13 changed files with 94 additions and 20 deletions

View File

@@ -1298,6 +1298,27 @@ SerializedMaterialParam& ShaderGenerator::findOrAddTextureGroupSampler(int32 ind
return param;
}
SerializedMaterialParam& ShaderGenerator::findOrAddGlobalSDF()
{
// Find
for (int32 i = 0; i < _parameters.Count(); i++)
{
SerializedMaterialParam& param = _parameters[i];
if (!param.IsPublic && param.Type == MaterialParameterType::GlobalSDF)
return param;
}
// Create
SerializedMaterialParam& param = _parameters.AddOne();
param.Type = MaterialParameterType::GlobalSDF;
param.IsPublic = false;
param.Override = true;
param.Name = TEXT("Global SDF");
param.ShaderName = getParamName(_parameters.Count());
param.ID = Guid(_parameters.Count(), 0, 0, 3); // Assign temporary id
return param;
}
String ShaderGenerator::getLocalName(int32 index)
{
return TEXT("local") + StringUtils::ToString(index);

View File

@@ -286,6 +286,7 @@ protected:
SerializedMaterialParam findOrAddCubeTexture(const Guid& id);
SerializedMaterialParam findOrAddSceneTexture(MaterialSceneTextures type);
SerializedMaterialParam& findOrAddTextureGroupSampler(int32 index);
SerializedMaterialParam& findOrAddGlobalSDF();
static String getLocalName(int32 index);
static String getParamName(int32 index);

View File

@@ -9,19 +9,19 @@
#include "Engine/Content/Content.h"
#include "Engine/Engine/GameplayGlobals.h"
#include "Engine/Graphics/Config.h"
#include "Engine/Renderer/GlobalSignDistanceFieldPass.h"
void ShaderGraphUtilities::GenerateShaderConstantBuffer(TextWriterUnicode& writer, Array<SerializedMaterialParam>& parameters)
{
int32 constantsOffset = 0;
int32 paddingIndex = 0;
for (int32 i = 0; i < parameters.Count(); i++)
{
auto& param = parameters[i];
const Char* format = nullptr;
int32 size;
int32 alignment;
bool zeroRegister = true;
switch (param.Type)
{
case MaterialParameterType::Bool:
@@ -107,11 +107,15 @@ void ShaderGraphUtilities::GenerateShaderConstantBuffer(TextWriterUnicode& write
alignment = 16;
format = TEXT("float4 {0};");
break;
default: ;
}
break;
}
default: ;
case MaterialParameterType::GlobalSDF:
zeroRegister = false;
size = sizeof(GlobalSignDistanceFieldPass::GlobalSDFData);
alignment = 16;
format = TEXT("GlobalSDFData {0};");
break;
}
if (format)
{
@@ -126,7 +130,8 @@ void ShaderGraphUtilities::GenerateShaderConstantBuffer(TextWriterUnicode& write
}
}
param.RegisterIndex = 0;
if (zeroRegister)
param.RegisterIndex = 0;
param.Offset = constantsOffset;
writer.WriteLine(format, param.ShaderName);
constantsOffset += size;
@@ -139,7 +144,9 @@ const Char* ShaderGraphUtilities::GenerateShaderResources(TextWriterUnicode& wri
for (int32 i = 0; i < parameters.Count(); i++)
{
auto& param = parameters[i];
const Char* format;
const Char* format = nullptr;
bool zeroOffset = true;
int32 registers = 1;
switch (param.Type)
{
case MaterialParameterType::NormalMap:
@@ -158,16 +165,19 @@ const Char* ShaderGraphUtilities::GenerateShaderResources(TextWriterUnicode& wri
case MaterialParameterType::GPUTextureVolume:
format = TEXT("Texture3D {0} : register(t{1});");
break;
default:
format = nullptr;
case MaterialParameterType::GlobalSDF:
format = TEXT("Texture3D<float> {0}_Tex[4] : register(t{1});");
registers = 4;
zeroOffset = false;
break;
}
if (format)
{
param.Offset = 0;
if (zeroOffset)
param.Offset = 0;
param.RegisterIndex = (byte)startRegister;
writer.WriteLine(format, param.ShaderName, startRegister);
startRegister++;
startRegister += registers;
if (param.RegisterIndex >= GPU_MAX_SR_BINDED)
{
return TEXT("Too many textures used. The maximum supported amount is " MACRO_TO_STR(GPU_MAX_SR_BINDED) " (including lightmaps and utility textures for lighting).");