From 395b4fa14309cb88faba8871dda51a14ac27385b Mon Sep 17 00:00:00 2001 From: assiduous Date: Thu, 21 Nov 2024 15:44:40 -0800 Subject: [PATCH] PBR Renderer: moved material shader attributes to a separate buffer --- PBR/interface/GLTF_PBR_Renderer.hpp | 19 ++-- PBR/interface/PBR_Renderer.hpp | 10 ++ PBR/src/GLTF_PBR_Renderer.cpp | 111 ++++++++++++------- PBR/src/PBR_Renderer.cpp | 68 ++++++++---- Shaders/PBR/private/RenderPBR.psh | 15 ++- Shaders/PBR/private/RenderPBR_Structures.fxh | 1 - 6 files changed, 151 insertions(+), 73 deletions(-) diff --git a/PBR/interface/GLTF_PBR_Renderer.hpp b/PBR/interface/GLTF_PBR_Renderer.hpp index 2ae3ca73..a31d82d4 100644 --- a/PBR/interface/GLTF_PBR_Renderer.hpp +++ b/PBR/interface/GLTF_PBR_Renderer.hpp @@ -261,15 +261,20 @@ class GLTF_PBR_Renderer : public PBR_Renderer const float4x4* PrevSkinPreTransform = nullptr; // #if USE_JOINTS && USE_SKIN_PRE_TRANSFORM && COMPUTE_MOTION_VECTORS const void* CustomData = nullptr; size_t CustomDataSize = 0; + }; + static void* WritePBRPrimitiveShaderAttribs(void* pDstShaderAttribs, + const PBRPrimitiveShaderAttribsData& AttribsData, + bool TransposeMatrices, + bool UseSkinPreTransform); - HLSL::PBRMaterialBasicAttribs** pMaterialBasicAttribsDstPtr = nullptr; + struct PBRMaterialShaderAttribsData + { + PSO_FLAGS PSOFlags = PSO_FLAG_NONE; + const std::array& TextureAttribIndices; + const GLTF::Material& Material; }; - static void* WritePBRPrimitiveShaderAttribs(void* pDstShaderAttribs, - const PBRPrimitiveShaderAttribsData& AttribsData, - const std::array& TextureAttribIndices, - const GLTF::Material& Material, - bool TransposeMatrices, - bool UseSkinPreTransform); + static void* WritePBRMaterialShaderAttribs(void* pDstShaderAttribs, + const PBRMaterialShaderAttribsData& AttribsData); struct PBRLightShaderAttribsData { diff --git a/PBR/interface/PBR_Renderer.hpp b/PBR/interface/PBR_Renderer.hpp index 0de23053..ed97e615 100644 --- a/PBR/interface/PBR_Renderer.hpp +++ b/PBR/interface/PBR_Renderer.hpp @@ -360,6 +360,10 @@ class PBR_Renderer /// If null, the renderer will allocate the buffer. IBuffer* pPrimitiveAttribsCB = nullptr; + /// A pointer to the user-provided material attribs buffer. + /// If null, the renderer will allocate the buffer. + IBuffer* pMaterialAttribsCB = nullptr; + /// A pointer to the user-provided joints buffer. /// If null, the renderer will allocate the buffer. IBuffer* pJointsBuffer = nullptr; @@ -462,6 +466,7 @@ class PBR_Renderer ITextureView* GetBlackTexSRV() const { return m_pBlackTexSRV; } ITextureView* GetDefaultNormalMapSRV() const { return m_pDefaultNormalMapSRV; } IBuffer* GetPBRPrimitiveAttribsCB() const {return m_PBRPrimitiveAttribsCB;} + IBuffer* GetPBRMaterialAttribsCB() const {return m_PBRMaterialAttribsCB;} IBuffer* GetJointsBuffer() const {return m_JointsBuffer;} // clang-format on @@ -692,6 +697,7 @@ class PBR_Renderer void InitCommonSRBVars(IShaderResourceBinding* pSRB, IBuffer* pFrameAttribs, bool BindPrimitiveAttribsBuffer = true, + bool BindMaterialAttribsBuffer = true, ITextureView* pShadowMap = nullptr) const; void SetMaterialTexture(IShaderResourceBinding* pSRB, ITextureView* pTexSRV, TEXTURE_ATTRIB_ID TextureId) const; @@ -705,6 +711,9 @@ class PBR_Renderer /// Returns the PBR primitive attributes shader data size for the given PSO flags. Uint32 GetPBRPrimitiveAttribsSize(PSO_FLAGS Flags, Uint32 CustomDataSize = sizeof(float4)) const; + /// Returns the PBR material attributes shader data size for the given PSO flags. + Uint32 GetPBRMaterialAttribsSize(PSO_FLAGS Flags) const; + /// Returns the PBR Frame attributes shader data size for the given light count. static Uint32 GetPRBFrameAttribsSize(Uint32 LightCount, Uint32 ShadowCastingLightCount); @@ -868,6 +877,7 @@ class PBR_Renderer IBL_PipelineStateObjectCache m_IBL_PSOCache; RefCntAutoPtr m_PBRPrimitiveAttribsCB; + RefCntAutoPtr m_PBRMaterialAttribsCB; RefCntAutoPtr m_PrecomputeEnvMapAttribsCB; RefCntAutoPtr m_JointsBuffer; diff --git a/PBR/src/GLTF_PBR_Renderer.cpp b/PBR/src/GLTF_PBR_Renderer.cpp index b0c8ad6f..5e04d1b3 100644 --- a/PBR/src/GLTF_PBR_Renderer.cpp +++ b/PBR/src/GLTF_PBR_Renderer.cpp @@ -536,8 +536,9 @@ void GLTF_PBR_Renderer::Render(IDeviceContext* pCtx, GLTF::Material::ALPHA_MODE_BLEND, // Transparent primitives - last (TODO: depth sorting) }; - IPipelineState* pCurrPSO = nullptr; - IShaderResourceBinding* pCurrSRB = nullptr; + IPipelineState* pCurrPSO = nullptr; + IShaderResourceBinding* pCurrSRB = nullptr; + const GLTF::Material* pCurrMaterial = nullptr; PSOKey CurrPsoKey; if (PrevTransforms == nullptr) @@ -577,8 +578,9 @@ void GLTF_PBR_Renderer::Render(IDeviceContext* pCtx, const PSOKey NewKey{PSOFlags, GltfAlphaModeToAlphaMode(AlphaMode), material.DoubleSided ? CULL_MODE_NONE : CULL_MODE_BACK, RenderParams.DebugView}; if (NewKey != CurrPsoKey) { - CurrPsoKey = NewKey; - pCurrPSO = nullptr; + CurrPsoKey = NewKey; + pCurrPSO = nullptr; + pCurrMaterial = nullptr; } if (pCurrPSO == nullptr) @@ -647,10 +649,6 @@ void GLTF_PBR_Renderer::Render(IDeviceContext* pCtx, pCtx->MapBuffer(m_PBRPrimitiveAttribsCB, MAP_WRITE, MAP_FLAG_DISCARD, pAttribsData); if (pAttribsData != nullptr) { - static_assert(static_cast(GLTF::Material::PBR_WORKFLOW_METALL_ROUGH) == PBR_WORKFLOW_METALL_ROUGH, "GLTF::Material::PBR_WORKFLOW_METALL_ROUGH != PBR_WORKFLOW_METALL_ROUGH"); - static_assert(static_cast(GLTF::Material::PBR_WORKFLOW_SPEC_GLOSS) == PBR_WORKFLOW_SPEC_GLOSS, "GLTF::Material::PBR_WORKFLOW_SPEC_GLOSS != PBR_WORKFLOW_SPEC_GLOSS"); - static_assert(static_cast(GLTF::Material::PBR_WORKFLOW_UNLIT) == PBR_WORKFLOW_UNLIT, "GLTF::Material::PBR_WORKFLOW_UNLIT != PBR_WORKFLOW_UNLIT"); - const float4x4 NodeTransform = NodeGlobalMatrix * RenderParams.ModelTransform; const float4x4& PrevNodeTransform = (CurrPsoKey.GetFlags() & PSO_FLAG_COMPUTE_MOTION_VECTORS) != 0 ? PrevNodeGlobalMatrix * RenderParams.ModelTransform : @@ -662,7 +660,7 @@ void GLTF_PBR_Renderer::Render(IDeviceContext* pCtx, &PrevNodeTransform, static_cast(JointCount), }; - auto* pEndPtr = WritePBRPrimitiveShaderAttribs(pAttribsData, AttribsData, m_Settings.TextureAttribIndices, material, !m_Settings.PackMatrixRowMajor, m_Settings.UseSkinPreTransform); + void* pEndPtr = WritePBRPrimitiveShaderAttribs(pAttribsData, AttribsData, !m_Settings.PackMatrixRowMajor, m_Settings.UseSkinPreTransform); VERIFY(reinterpret_cast(pEndPtr) <= static_cast(pAttribsData) + m_PBRPrimitiveAttribsCB->GetDesc().Size, "Not enough space in the buffer to store primitive attributes"); @@ -675,6 +673,36 @@ void GLTF_PBR_Renderer::Render(IDeviceContext* pCtx, } } + if (pCurrMaterial != &material) + { + void* pAttribsData = nullptr; + pCtx->MapBuffer(m_PBRMaterialAttribsCB, MAP_WRITE, MAP_FLAG_DISCARD, pAttribsData); + if (pAttribsData != nullptr) + { + static_assert(static_cast(GLTF::Material::PBR_WORKFLOW_METALL_ROUGH) == PBR_WORKFLOW_METALL_ROUGH, "GLTF::Material::PBR_WORKFLOW_METALL_ROUGH != PBR_WORKFLOW_METALL_ROUGH"); + static_assert(static_cast(GLTF::Material::PBR_WORKFLOW_SPEC_GLOSS) == PBR_WORKFLOW_SPEC_GLOSS, "GLTF::Material::PBR_WORKFLOW_SPEC_GLOSS != PBR_WORKFLOW_SPEC_GLOSS"); + static_assert(static_cast(GLTF::Material::PBR_WORKFLOW_UNLIT) == PBR_WORKFLOW_UNLIT, "GLTF::Material::PBR_WORKFLOW_UNLIT != PBR_WORKFLOW_UNLIT"); + + PBRMaterialShaderAttribsData AttribsData{ + CurrPsoKey.GetFlags(), + m_Settings.TextureAttribIndices, + material, + }; + void* pEndPtr = WritePBRMaterialShaderAttribs(pAttribsData, AttribsData); + + VERIFY(reinterpret_cast(pEndPtr) <= static_cast(pAttribsData) + m_PBRMaterialAttribsCB->GetDesc().Size, + "Not enough space in the buffer to store material attributes"); + + pCtx->UnmapBuffer(m_PBRMaterialAttribsCB, MAP_WRITE); + } + else + { + UNEXPECTED("Unable to map the buffer"); + } + + pCurrMaterial = &material; + } + if (primitive.HasIndices()) { DrawIndexedAttribs drawAttrs{primitive.IndexCount, VT_UINT32, DRAW_FLAG_VERIFY_ALL}; @@ -710,12 +738,10 @@ Uint8* WriteShaderAttribs(Uint8* pDstPtr, HostStructType* pSrc, const char* Debu } -void* GLTF_PBR_Renderer::WritePBRPrimitiveShaderAttribs(void* pDstShaderAttribs, - const PBRPrimitiveShaderAttribsData& AttribsData, - const std::array& TextureAttribIndices, - const GLTF::Material& Material, - bool TransposeMatrices, - bool UseSkinPreTransform) +void* GLTF_PBR_Renderer::WritePBRPrimitiveShaderAttribs(void* pDstShaderAttribs, + const PBRPrimitiveShaderAttribsData& AttribsData, + bool TransposeMatrices, + bool UseSkinPreTransform) { // When adding new members, don't forget to update PBR_Renderer::GetPBRPrimitiveAttribsSize! @@ -740,16 +766,6 @@ void* GLTF_PBR_Renderer::WritePBRPrimitiveShaderAttribs(void* // float4x4 PrevSkinPreTransform; // #if USE_JOINTS && USE_SKIN_PRE_TRANSFORM && COMPUTE_MOTION_VECTORS // } Transforms; // - // struct PBRMaterialShaderInfo - // { - // PBRMaterialBasicAttribs Basic; - // PBRMaterialSheenAttribs Sheen; // #if ENABLE_SHEEN - // PBRMaterialAnisotropyAttribs Anisotropy; // #if ENABLE_ANISOTROPY - // PBRMaterialIridescenceAttribs Iridescence; // #if ENABLE_IRIDESCENCE - // PBRMaterialTransmissionAttribs Transmission; // #if ENABLE_TRANSMISSION - // PBRMaterialVolumeAttribs Volume; // #if ENABLE_VOLUME - // PBRMaterialTextureAttribs Textures[PBR_NUM_TEXTURE_ATTRIBUTES]; - // } Material; // UserDefined CustomData; //}; @@ -823,8 +839,38 @@ void* GLTF_PBR_Renderer::WritePBRPrimitiveShaderAttribs(void* } } - if (AttribsData.pMaterialBasicAttribsDstPtr != nullptr) - *AttribsData.pMaterialBasicAttribsDstPtr = reinterpret_cast(pDstPtr); + { + if (AttribsData.CustomData != nullptr) + { + VERIFY_EXPR(AttribsData.CustomDataSize > 0); + memcpy(pDstPtr, AttribsData.CustomData, AttribsData.CustomDataSize); + } + pDstPtr += AttribsData.CustomDataSize; + } + + return pDstPtr; +} + +void* GLTF_PBR_Renderer::WritePBRMaterialShaderAttribs(void* pDstShaderAttribs, + const PBRMaterialShaderAttribsData& AttribsData) +{ + // When adding new members, don't forget to update PBR_Renderer::GetPBRMaterialAttribsSize! + + // struct PBRMaterialShaderInfo + // { + // PBRMaterialBasicAttribs Basic; + // PBRMaterialSheenAttribs Sheen; // #if ENABLE_SHEEN + // PBRMaterialAnisotropyAttribs Anisotropy; // #if ENABLE_ANISOTROPY + // PBRMaterialIridescenceAttribs Iridescence; // #if ENABLE_IRIDESCENCE + // PBRMaterialTransmissionAttribs Transmission; // #if ENABLE_TRANSMISSION + // PBRMaterialVolumeAttribs Volume; // #if ENABLE_VOLUME + // PBRMaterialTextureAttribs Textures[PBR_NUM_TEXTURE_ATTRIBUTES]; + // } Material; + + const GLTF::Material& Material = AttribsData.Material; + + Uint8* pDstPtr = reinterpret_cast(pDstShaderAttribs); + pDstPtr = WriteShaderAttribs(pDstPtr, &Material.Attribs, "Basic Attribs"); if (AttribsData.PSOFlags & PSO_FLAG_ENABLE_SHEEN) @@ -859,7 +905,7 @@ void* GLTF_PBR_Renderer::WritePBRPrimitiveShaderAttribs(void* Uint32 NumTextureAttribs = 0; ProcessTexturAttribs(AttribsData.PSOFlags, [&](int CurrIndex, PBR_Renderer::TEXTURE_ATTRIB_ID AttribId) // { - const int SrcAttribIndex = TextureAttribIndices[AttribId]; + const int SrcAttribIndex = AttribsData.TextureAttribIndices[AttribId]; if (SrcAttribIndex < 0) { UNEXPECTED("Shader attribute ", Uint32{AttribId}, " is not initialized"); @@ -875,15 +921,6 @@ void* GLTF_PBR_Renderer::WritePBRPrimitiveShaderAttribs(void* pDstPtr = reinterpret_cast(pDstTextures + NumTextureAttribs); } - { - if (AttribsData.CustomData != nullptr) - { - VERIFY_EXPR(AttribsData.CustomDataSize > 0); - memcpy(pDstPtr, AttribsData.CustomData, AttribsData.CustomDataSize); - } - pDstPtr += AttribsData.CustomDataSize; - } - return pDstPtr; } diff --git a/PBR/src/PBR_Renderer.cpp b/PBR/src/PBR_Renderer.cpp index 0e60f1ed..4275e5e5 100644 --- a/PBR/src/PBR_Renderer.cpp +++ b/PBR/src/PBR_Renderer.cpp @@ -277,6 +277,7 @@ PBR_Renderer::PBR_Renderer(IRenderDevice* pDevice, }(CI)}, m_Device{pDevice, pStateCache}, m_PBRPrimitiveAttribsCB{CI.pPrimitiveAttribsCB}, + m_PBRMaterialAttribsCB{CI.pMaterialAttribsCB}, m_JointsBuffer{CI.pJointsBuffer} { if (m_Settings.EnableIBL) @@ -430,6 +431,10 @@ PBR_Renderer::PBR_Renderer(IRenderDevice* pDevice, { CreateUniformBuffer(pDevice, GetPBRPrimitiveAttribsSize(PSO_FLAG_ALL), "PBR primitive attribs CB", &m_PBRPrimitiveAttribsCB); } + if (!m_PBRMaterialAttribsCB) + { + CreateUniformBuffer(pDevice, GetPBRMaterialAttribsSize(PSO_FLAG_ALL), "PBR material attribs CB", &m_PBRMaterialAttribsCB); + } if (m_Settings.MaxJointCount > 0) { const Uint32 MaxJointCount = 65536 / (2 * sizeof(float4x4)); @@ -467,6 +472,7 @@ PBR_Renderer::PBR_Renderer(IRenderDevice* pDevice, } std::vector Barriers; Barriers.emplace_back(m_PBRPrimitiveAttribsCB, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_CONSTANT_BUFFER, STATE_TRANSITION_FLAG_UPDATE_STATE); + Barriers.emplace_back(m_PBRMaterialAttribsCB, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_CONSTANT_BUFFER, STATE_TRANSITION_FLAG_UPDATE_STATE); if (m_JointsBuffer) { const RESOURCE_STATE JointsBufferState = m_Settings.JointsBufferMode == JOINTS_BUFFER_MODE_UNIFORM ? @@ -859,6 +865,7 @@ void PBR_Renderer::PrecomputeCubemaps(IDeviceContext* pCtx, void PBR_Renderer::InitCommonSRBVars(IShaderResourceBinding* pSRB, IBuffer* pFrameAttribs, bool BindPrimitiveAttribsBuffer, + bool BindMaterialAttribsBuffer, ITextureView* pShadowMap) const { if (pSRB == nullptr) @@ -876,6 +883,15 @@ void PBR_Renderer::InitCommonSRBVars(IShaderResourceBinding* pSRB, } } + if (BindMaterialAttribsBuffer) + { + if (IShaderResourceVariable* pVar = pSRB->GetVariableByName(SHADER_TYPE_PIXEL, "cbMaterialAttribs")) + { + if (pVar->Get() == nullptr) + pVar->Set(m_PBRMaterialAttribsCB); + } + } + if (m_Settings.MaxJointCount > 0) { if (IShaderResourceVariable* pVar = pSRB->GetVariableByName(SHADER_TYPE_VERTEX, GetJointTransformsVarName())) @@ -972,7 +988,8 @@ void PBR_Renderer::CreateSignature() SignatureDesc .SetUseCombinedTextureSamplers(m_Device.GetDeviceInfo().IsGLDevice()) .AddResource(SHADER_TYPE_VS_PS, "cbFrameAttribs", SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE) - .AddResource(SHADER_TYPE_VS_PS, "cbPrimitiveAttribs", SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE); + .AddResource(SHADER_TYPE_VS_PS, "cbPrimitiveAttribs", SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE) + .AddResource(SHADER_TYPE_VS_PS, "cbMaterialAttribs", SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE); if (m_Settings.MaxJointCount > 0) { @@ -2016,19 +2033,34 @@ Uint32 PBR_Renderer::GetPBRPrimitiveAttribsSize(PSO_FLAGS Flags, Uint32 CustomDa // float4x4 PrevSkinPreTransform; // #if USE_JOINTS && USE_SKIN_PRE_TRANSFORM && COMPUTE_MOTION_VECTORS // } Transforms; // - // struct PBRMaterialShaderInfo - // { - // PBRMaterialBasicAttribs Basic; - // PBRMaterialSheenAttribs Sheen; // #if ENABLE_SHEEN - // PBRMaterialAnisotropyAttribs Anisotropy; // #if ENABLE_ANISOTROPY - // PBRMaterialIridescenceAttribs Iridescence; // #if ENABLE_IRIDESCENCE - // PBRMaterialTransmissionAttribs Transmission; // #if ENABLE_TRANSMISSION - // PBRMaterialVolumeAttribs Volume; // #if ENABLE_VOLUME - // PBRMaterialTextureAttribs Textures[PBR_NUM_TEXTURE_ATTRIBUTES]; - // } Material; // UserDefined CustomData; //}; + const bool UseSkinPreTransform = m_Settings.UseSkinPreTransform && (Flags & PSO_FLAG_USE_JOINTS) != 0; + const bool UsePrevSkinPreTransform = UseSkinPreTransform && (Flags & PSO_FLAG_COMPUTE_MOTION_VECTORS) != 0; + + return (sizeof(float4x4) + // Transforms.NodeMatrix + ((Flags & PSO_FLAG_COMPUTE_MOTION_VECTORS) ? sizeof(float4x4) : 0) + // Transforms.PrevNodeMatrix + sizeof(int) * 2 + sizeof(float) * 6 + // Transforms.JointCount ... Transforms.PosScaleZ + (UseSkinPreTransform ? sizeof(float4x4) : 0) + // Transforms.SkinPreTransform + (UsePrevSkinPreTransform ? sizeof(float4x4) : 0) + // Transforms.PrevSkinPreTransform + + CustomDataSize); +} + +Uint32 PBR_Renderer::GetPBRMaterialAttribsSize(PSO_FLAGS Flags) const +{ + // struct PBRMaterialShaderInfo + // { + // PBRMaterialBasicAttribs Basic; + // PBRMaterialSheenAttribs Sheen; // #if ENABLE_SHEEN + // PBRMaterialAnisotropyAttribs Anisotropy; // #if ENABLE_ANISOTROPY + // PBRMaterialIridescenceAttribs Iridescence; // #if ENABLE_IRIDESCENCE + // PBRMaterialTransmissionAttribs Transmission; // #if ENABLE_TRANSMISSION + // PBRMaterialVolumeAttribs Volume; // #if ENABLE_VOLUME + // PBRMaterialTextureAttribs Textures[PBR_NUM_TEXTURE_ATTRIBUTES]; + // } Material; + Uint32 NumTextureAttribs = 0; ProcessTexturAttribs(Flags, [&](int CurrIndex, PBR_Renderer::TEXTURE_ATTRIB_ID AttribId) // { @@ -2039,23 +2071,13 @@ Uint32 PBR_Renderer::GetPBRPrimitiveAttribsSize(PSO_FLAGS Flags, Uint32 CustomDa } }); - const bool UseSkinPreTransform = m_Settings.UseSkinPreTransform && (Flags & PSO_FLAG_USE_JOINTS) != 0; - const bool UsePrevSkinPreTransform = UseSkinPreTransform && (Flags & PSO_FLAG_COMPUTE_MOTION_VECTORS) != 0; - - return (sizeof(float4x4) + // Transforms.NodeMatrix - ((Flags & PSO_FLAG_COMPUTE_MOTION_VECTORS) ? sizeof(float4x4) : 0) + // Transforms.PrevNodeMatrix - sizeof(int) * 2 + sizeof(float) * 6 + // Transforms.JointCount ... Transforms.PosScaleZ - (UseSkinPreTransform ? sizeof(float4x4) : 0) + // Transforms.SkinPreTransform - (UsePrevSkinPreTransform ? sizeof(float4x4) : 0) + // Transforms.PrevSkinPreTransform - - sizeof(HLSL::PBRMaterialBasicAttribs) + + return (sizeof(HLSL::PBRMaterialBasicAttribs) + ((Flags & PSO_FLAG_ENABLE_SHEEN) ? sizeof(HLSL::PBRMaterialSheenAttribs) : 0) + ((Flags & PSO_FLAG_ENABLE_ANISOTROPY) ? sizeof(HLSL::PBRMaterialAnisotropyAttribs) : 0) + ((Flags & PSO_FLAG_ENABLE_IRIDESCENCE) ? sizeof(HLSL::PBRMaterialIridescenceAttribs) : 0) + ((Flags & PSO_FLAG_ENABLE_TRANSMISSION) ? sizeof(HLSL::PBRMaterialTransmissionAttribs) : 0) + ((Flags & PSO_FLAG_ENABLE_VOLUME) ? sizeof(HLSL::PBRMaterialVolumeAttribs) : 0) + - sizeof(HLSL::PBRMaterialTextureAttribs) * NumTextureAttribs + - CustomDataSize); + sizeof(HLSL::PBRMaterialTextureAttribs) * NumTextureAttribs); } Uint32 PBR_Renderer::GetPRBFrameAttribsSize(Uint32 LightCount, Uint32 ShadowCastingLightCount) diff --git a/Shaders/PBR/private/RenderPBR.psh b/Shaders/PBR/private/RenderPBR.psh index 316c1dcf..12ab17c2 100644 --- a/Shaders/PBR/private/RenderPBR.psh +++ b/Shaders/PBR/private/RenderPBR.psh @@ -62,6 +62,11 @@ cbuffer cbPrimitiveAttribs # define PRIMITIVE g_Primitive #endif +cbuffer cbMaterialAttribs +{ + PBRMaterialShaderInfo g_Material; +} + #if ENABLE_SHADOWS Texture2DArray g_ShadowMap; SamplerComparisonState g_ShadowMap_sampler; @@ -373,7 +378,7 @@ float4 GetLoadingAnimationColor(float3 WorldPos, float Factor) PSOutput main(in VSOutput VSOut, in bool IsFrontFace : SV_IsFrontFace) { - float4 BaseColor = GetBaseColor(VSOut, PRIMITIVE.Material, g_Frame.Renderer.MipBias); + float4 BaseColor = GetBaseColor(VSOut, g_Material, g_Frame.Renderer.MipBias); #if USE_VERTEX_NORMALS float3 MeshNormal = VSOut.Normal; @@ -387,7 +392,7 @@ PSOutput main(in VSOutput VSOut, PBRMaterialTextureAttribs NormalTexAttribs; # if USE_NORMAL_MAP { - NormalTexAttribs = PRIMITIVE.Material.Textures[NormalTextureAttribId]; + NormalTexAttribs = g_Material.Textures[NormalTextureAttribId]; } # else { @@ -400,7 +405,7 @@ PSOutput main(in VSOutput VSOut, NormalMapUVInfo ClearCoatNMUVInfo; # if USE_CLEAR_COAT_NORMAL_MAP { - ClearCoatNMUVInfo = GetNormalMapUVInfo(VSOut, PRIMITIVE.Material.Textures[ClearCoatNormalTextureAttribId]); + ClearCoatNMUVInfo = GetNormalMapUVInfo(VSOut, g_Material.Textures[ClearCoatNormalTextureAttribId]); } # else { @@ -408,7 +413,7 @@ PSOutput main(in VSOutput VSOut, } # endif - PBRMaterialBasicAttribs BasicAttribs = PRIMITIVE.Material.Basic; + PBRMaterialBasicAttribs BasicAttribs = g_Material.Basic; # if PBR_ALPHA_MODE == PBR_ALPHA_MODE_MASK if (BaseColor.a < BasicAttribs.AlphaMaskCutoff) { @@ -422,7 +427,7 @@ PSOutput main(in VSOutput VSOut, } # endif - SurfaceShadingInfo Shading = GetSurfaceShadingInfo(VSOut, PRIMITIVE.Material, BaseColor, NormalInfo, NMUVInfo, ClearCoatNMUVInfo); + SurfaceShadingInfo Shading = GetSurfaceShadingInfo(VSOut, g_Material, BaseColor, NormalInfo, NMUVInfo, ClearCoatNMUVInfo); SurfaceLightingInfo SrfLighting = GetDefaultSurfaceLightingInfo(); float4 OutColor; diff --git a/Shaders/PBR/private/RenderPBR_Structures.fxh b/Shaders/PBR/private/RenderPBR_Structures.fxh index 3831cd29..1d522b05 100644 --- a/Shaders/PBR/private/RenderPBR_Structures.fxh +++ b/Shaders/PBR/private/RenderPBR_Structures.fxh @@ -30,7 +30,6 @@ struct PBRFrameAttribs struct PBRPrimitiveAttribs { GLTFNodeShaderTransforms Transforms; - PBRMaterialShaderInfo Material; float4 CustomData; };