diff --git a/Source/Engine/Graphics/Materials/MaterialShader.cpp b/Source/Engine/Graphics/Materials/MaterialShader.cpp index ef119245d..ac1b1c6f9 100644 --- a/Source/Engine/Graphics/Materials/MaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/MaterialShader.cpp @@ -3,6 +3,7 @@ #include "MaterialShader.h" #include "Engine/Core/Log.h" #include "Engine/Serialization/MemoryReadStream.h" +#include "Engine/Level/LargeWorlds.h" #include "Engine/Renderer/RenderList.h" #include "Engine/Graphics/RenderTask.h" #include "Engine/Graphics/GPUDevice.h" @@ -33,6 +34,8 @@ GPU_CB_STRUCT(MaterialShaderDataPerView { Float4 ViewInfo; Float4 ScreenSize; Float4 TemporalAAJitter; + Float3 LargeWorldsChunkIndex; + float LargeWorldsChunkSize; }); IMaterial::BindParameters::BindParameters(::GPUContext* context, const ::RenderContext& renderContext) @@ -78,6 +81,8 @@ void IMaterial::BindParameters::BindViewData() cb.ViewInfo = view.ViewInfo; cb.ScreenSize = view.ScreenSize; cb.TemporalAAJitter = view.TemporalAAJitter; + cb.LargeWorldsChunkIndex = LargeWorlds::Enable ? (Float3)Int3(view.Origin / LargeWorlds::ChunkSize) : Float3::Zero; + cb.LargeWorldsChunkSize = LargeWorlds::ChunkSize; // Update constants GPUContext->UpdateCB(PerViewConstants, &cb); diff --git a/Source/Engine/Graphics/Materials/MaterialShader.h b/Source/Engine/Graphics/Materials/MaterialShader.h index fce9b56e4..8170c8e5a 100644 --- a/Source/Engine/Graphics/Materials/MaterialShader.h +++ b/Source/Engine/Graphics/Materials/MaterialShader.h @@ -10,7 +10,7 @@ /// /// Current materials shader version. /// -#define MATERIAL_GRAPH_VERSION 169 +#define MATERIAL_GRAPH_VERSION 170 class Material; class GPUShader; diff --git a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Textures.cpp b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Textures.cpp index 58448f5ea..6c4269be2 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Textures.cpp +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Textures.cpp @@ -697,10 +697,11 @@ void MaterialGenerator::ProcessGroupTextures(Box* box, Node* node, Value& value) auto result = writeLocal(Value::InitForZero(ValueType::Float4), node); const String triplanarTexture = String::Format(TEXT( " {{\n" - " float3 worldPos = input.WorldPosition.xyz * ({1} * 0.001f);\n" + " float tiling = {1} * 0.001f;\n" + " float3 worldPos = (input.WorldPosition.xyz + GetLargeWorldsTileOffset(1.0f / tiling)) * tiling;\n" " float3 normal = abs(input.TBN[2]);\n" " normal = pow(normal, {2});\n" - " normal = normal / (normal.x + normal.y + normal.z);\n" + " normal = normalize(normal);\n" " {3} += {0}.{4}(SamplerLinearWrap, worldPos.yz{5}) * normal.x;\n" " {3} += {0}.{4}(SamplerLinearWrap, worldPos.xz{5}) * normal.y;\n" " {3} += {0}.{4}(SamplerLinearWrap, worldPos.xy{5}) * normal.z;\n" diff --git a/Source/Shaders/MaterialCommon.hlsl b/Source/Shaders/MaterialCommon.hlsl index 325f8d065..d27b3aa01 100644 --- a/Source/Shaders/MaterialCommon.hlsl +++ b/Source/Shaders/MaterialCommon.hlsl @@ -171,6 +171,8 @@ cbuffer ViewData : register(b1) float4 ViewInfo; float4 ScreenSize; float4 TemporalAAJitter; + float3 LargeWorldsChunkIndex; + float LargeWorldsChunkSize; }; #endif @@ -277,4 +279,14 @@ float2 Flipbook(float2 uv, float frame, float2 sizeXY, float2 flipXY = 0.0f) return (uv + frameXY) / sizeXY; } +#if USE_PER_VIEW_CONSTANTS + +// Calculates the world-position offset to stabilize tiling (eg. via triplanar mapping) due to Large Worlds view origin offset. +float3 GetLargeWorldsTileOffset(float tileSize) +{ + return LargeWorldsChunkIndex * fmod(LargeWorldsChunkSize, tileSize); +} + +#endif + #endif