Terrain macro material fixes (#5182)

* Minor fixes for macro materials
- When macro image views are no longer used, they will explicitely be set to nullptr
- limiting for loop in shader to the number of macro materials total so it doesn't read unitialized memory

Signed-off-by: Ken Pruiksma <pruiksma@amazon.com>

* Removing parts of the terrain shader no longer used.

Signed-off-by: Ken Pruiksma <pruiksma@amazon.com>

* Fixing normalization in shaders, adding default valus for all structs used in SRGs.

Signed-off-by: Ken Pruiksma <pruiksma@amazon.com>
monroegm-disable-blank-issue-2
Ken Pruiksma 4 years ago committed by GitHub
parent 0ccd55f945
commit d52ce49dcb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -22,11 +22,9 @@ struct VSOutput
{
float4 m_position : SV_Position;
float3 m_normal: NORMAL;
float3 m_tangent : TANGENT;
float3 m_bitangent : BITANGENT;
float3 m_worldPosition : UV0;
float3 m_shadowCoords[ViewSrg::MaxCascadeCount] : UV2;
float2 m_uv : UV1;
float3 m_shadowCoords[ViewSrg::MaxCascadeCount] : UV2;
};
VSOutput TerrainPBR_MainPassVS(VertexInput IN)
@ -47,9 +45,9 @@ VSOutput TerrainPBR_MainPassVS(VertexInput IN)
float down = GetHeight(origUv + terrainData.m_uvStep * float2( 0.0f, 1.0f));
float left = GetHeight(origUv + terrainData.m_uvStep * float2(-1.0f, 0.0f));
OUT.m_bitangent = normalize(float3(0.0, terrainData.m_sampleSpacing * 2.0f, down - up));
OUT.m_tangent = normalize(float3(terrainData.m_sampleSpacing * 2.0f, 0.0, right - left));
OUT.m_normal = cross(OUT.m_tangent, OUT.m_bitangent);
float3 bitangent = normalize(float3(0.0, terrainData.m_sampleSpacing * 2.0f, down - up));
float3 tangent = normalize(float3(terrainData.m_sampleSpacing * 2.0f, 0.0, right - left));
OUT.m_normal = normalize(cross(tangent, bitangent));
OUT.m_uv = uv;
// directional light shadow
@ -75,18 +73,14 @@ ForwardPassOutput TerrainPBR_MainPassPS(VSOutput IN)
surface.position = IN.m_worldPosition.xyz;
float viewDistance = length(ViewSrg::m_worldPosition - surface.position);
float detailFactor = saturate((viewDistance - TerrainMaterialSrg::m_detailFadeDistance) / max(TerrainMaterialSrg::m_detailFadeLength, EPSILON));
ObjectSrg::TerrainData terrainData = ObjectSrg::m_terrainData;
float2 origUv = lerp(terrainData.m_uvMin, terrainData.m_uvMax, IN.m_uv);
origUv.y = 1.0 - origUv.y;
float2 detailUv = IN.m_uv * TerrainMaterialSrg::m_detailTextureMultiplier;
// ------- Normal -------
float3 macroNormal = IN.m_normal;
float3 macroNormal = normalize(IN.m_normal);
// ------- Macro Color / Normal -------
float3 macroColor = TerrainMaterialSrg::m_baseColor.rgb;
[unroll] for (uint i = 0; i < 4; ++i)
[unroll] for (uint i = 0; i < 4 && (i < ObjectSrg::m_macroMaterialCount); ++i)
{
float2 macroUvMin = ObjectSrg::m_macroMaterialData[i].m_uvMin;
float2 macroUvMax = ObjectSrg::m_macroMaterialData[i].m_uvMax;

@ -248,6 +248,7 @@ namespace Terrain
{
m_configuration.m_macroColorAsset = asset;
m_colorImage = AZ::RPI::StreamingImage::FindOrCreate(m_configuration.m_macroColorAsset);
m_colorImage->GetRHIImage()->SetName(AZ::Name(m_configuration.m_macroColorAsset.GetHint()));
// Clear the texture asset reference to make sure we don't prevent hot-reloading.
m_configuration.m_macroColorAsset.Release();
@ -256,6 +257,7 @@ namespace Terrain
{
m_configuration.m_macroNormalAsset = asset;
m_normalImage = AZ::RPI::StreamingImage::FindOrCreate(m_configuration.m_macroNormalAsset);
m_normalImage->GetRHIImage()->SetName(AZ::Name(m_configuration.m_macroNormalAsset.GetHint()));
// Clear the texture asset reference to make sure we don't prevent hot-reloading.
m_configuration.m_macroColorAsset.Release();

@ -535,7 +535,9 @@ namespace Terrain
sectorData.m_srg->SetConstant(m_terrainDataIndex, terrainDataForSrg);
AZStd::array<ShaderMacroMaterialData, MaxMaterialsPerSector> macroMaterialData;
for (uint32_t i = 0; i < sectorData.m_macroMaterials.size(); ++i)
uint32_t i = 0;
for (; i < sectorData.m_macroMaterials.size(); ++i)
{
const MacroMaterialData& materialData = m_macroMaterials.GetData(sectorData.m_macroMaterials.at(i));
ShaderMacroMaterialData& shaderData = macroMaterialData.at(i);
@ -564,6 +566,11 @@ namespace Terrain
// set flags for which images are used.
shaderData.m_mapsInUse = (colorImageView ? ColorImageUsed : 0) | (normalImageView ? NormalImageUsed : 0);
}
for (; i < sectorData.m_macroMaterials.capacity(); ++i)
{
sectorData.m_srg->SetImageView(m_macroColorMapIndex, nullptr, i);
sectorData.m_srg->SetImageView(m_macroNormalMapIndex, nullptr, i);
}
sectorData.m_srg->SetConstantArray(m_macroMaterialDataIndex, macroMaterialData);
sectorData.m_srg->SetConstant(m_macroMaterialCountIndex, aznumeric_cast<uint32_t>(sectorData.m_macroMaterials.size()));

@ -68,18 +68,18 @@ namespace Terrain
struct ShaderTerrainData // Must align with struct in Object Srg
{
AZStd::array<float, 2> m_uvMin;
AZStd::array<float, 2> m_uvMax;
AZStd::array<float, 2> m_uvStep;
float m_sampleSpacing;
float m_heightScale;
AZStd::array<float, 2> m_uvMin{ 0.0f, 0.0f };
AZStd::array<float, 2> m_uvMax{ 1.0f, 1.0f };
AZStd::array<float, 2> m_uvStep{ 1.0f, 1.0f };
float m_sampleSpacing{ 1.0f };
float m_heightScale{ 1.0f };
};
struct ShaderMacroMaterialData
struct ShaderMacroMaterialData // Must align with struct in Object Srg
{
AZStd::array<float, 2> m_uvMin;
AZStd::array<float, 2> m_uvMax;
float m_normalFactor;
AZStd::array<float, 2> m_uvMin{ 0.0f, 0.0f };
AZStd::array<float, 2> m_uvMax{ 1.0f, 1.0f };
float m_normalFactor{ 0.0f };
uint32_t m_flipNormalX{ 0 }; // bool in shader
uint32_t m_flipNormalY{ 0 }; // bool in shader
uint32_t m_mapsInUse{ 0b00 }; // 0b01 = color, 0b10 = normal

Loading…
Cancel
Save