Merge commit 'd52ce49dcb827c04150a6f11b7cceead9f61a43c' into mbalfour/gitflow_211102_o3de
This commit is contained in:
@@ -23,11 +23,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;
|
||||
};
|
||||
|
||||
option bool o_debugDetailMaterialIds = false;
|
||||
@@ -50,9 +48,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
|
||||
@@ -78,18 +76,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();
|
||||
|
||||
@@ -1149,7 +1149,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);
|
||||
@@ -1178,6 +1180,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()));
|
||||
|
||||
@@ -71,18 +71,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
|
||||
|
||||
Reference in New Issue
Block a user