Browse Source

Add support for tangent stream pairing with the first UV from the model. ASV part for compatibility.

jiaweig 4 năm trước cách đây
mục cha
commit
5dbbfc325d

+ 8 - 3
Gem/Code/Source/RHI/AsyncComputeExampleComponent.cpp

@@ -336,7 +336,7 @@ namespace AtomSampleViewer
                     return;
                 }
             }
-                        
+
             {
                 // Model Pipeline
                 Data::Instance<AZ::RPI::ModelLod> modelLod = m_model->GetLods()[0];
@@ -344,9 +344,10 @@ namespace AtomSampleViewer
                 modelLod->GetStreamsForMesh(
                     pipelineDesc.m_inputStreamLayout,
                     m_modelStreamBufferViews[ShadowScope],
+                    m_uvStreamTangentIndex,
                     variant.GetInputContract(),
                     0);
-                                    
+
                 m_modelPipelineStates[ShadowScope] = shader->AcquirePipelineState(pipelineDesc);
                 if (!m_modelPipelineStates[ShadowScope])
                 {
@@ -400,10 +401,12 @@ namespace AtomSampleViewer
             {
                 // Model Pipeline
                 Data::Instance<AZ::RPI::ModelLod> modelLod = m_model->GetLods()[0];
+                AZ::RPI::UvStreamTangentIndex uvStreamTangentIndex;
 
                 modelLod->GetStreamsForMesh(
                     pipelineDesc.m_inputStreamLayout,
                     m_modelStreamBufferViews[ForwardScope],
+                    uvStreamTangentIndex,
                     variant.GetInputContract(),
                     0);
 
@@ -447,7 +450,7 @@ namespace AtomSampleViewer
             {
                 AZ_Error(AsyncCompute::sampleName, false, "Invalid stream buffer views for LuminanceMap");
                 return;
-            }                
+            }
 
             m_copyTexturePipelineState = shader->AcquirePipelineState(pipelineDesc);
             if (!m_copyTexturePipelineState)
@@ -964,6 +967,8 @@ namespace AtomSampleViewer
             for (const auto& shaderResourceGroup : m_shaderResourceGroups[ForwardScope])
             {
                 shaderResourceGroup->SetImageView(m_shaderInputImageIndex, imageView);
+                RHI::ShaderInputNameIndex shaderUvStreamTangentIndex = "m_uvStreamTangentIndex";
+                shaderResourceGroup->SetConstant(shaderUvStreamTangentIndex, m_uvStreamTangentIndex);
                 shaderResourceGroup->Compile();
             }
         };

+ 2 - 0
Gem/Code/Source/RHI/AsyncComputeExampleComponent.h

@@ -152,6 +152,8 @@ namespace AtomSampleViewer
         // Camera projection matrix
         AZ::Matrix4x4 m_projectionMatrix;
 
+        AZ::RPI::UvStreamTangentIndex m_uvStreamTangentIndex;
+
         AZStd::array<AZStd::vector<AZ::Data::Instance<AZ::RPI::ShaderResourceGroup>>, NumScopes> m_shaderResourceGroups;
         AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> m_viewShaderResourceGroup;
         AZ::RHI::ShaderInputImageIndex m_shaderInputImageIndex;

+ 11 - 13
Gem/Code/Source/RHI/BindlessPrototypeExampleComponent.cpp

@@ -277,7 +277,8 @@ namespace AtomSampleViewer
             // Set the buffer stream
             RHI::InputStreamLayout layout;
             const ShaderVariant& shaderVariant = m_shader->GetVariant(RPI::ShaderAsset::RootShaderVariantStableId);
-            m_model->GetLods()[lodModel]->GetStreamsForMesh(layout, subMeshInstance.bufferStreamViewArray, shaderVariant.GetInputContract(), subMeshIdx);
+            AZ::RPI::UvStreamTangentIndex uvStreamTangentIndex;
+            m_model->GetLods()[lodModel]->GetStreamsForMesh(layout, subMeshInstance.bufferStreamViewArray, uvStreamTangentIndex, shaderVariant.GetInputContract(), subMeshIdx);
         }
     }
 
@@ -393,8 +394,8 @@ namespace AtomSampleViewer
 
         // Set up the SRGs
         {
-            const char* floatBufferSrgPath = "shaders/rhi/bindlessprototypesrg_floatbuffersrg.azsrg";
-            const char* imageSrgPath = "shaders/rhi/bindlessprototypesrg_imagesrg.azsrg";
+            const char* floatBufferSrgPath = "shaderlib/atom/rpi/shaderresourcegroups/bindlessprototypesrg_floatbuffersrg.azsrg";
+            const char* imageSrgPath = "shaderlib/atom/rpi/shaderresourcegroups/bindlessprototypesrg_imagesrg.azsrg";
 
             // Set the FloatBufferSrg
             m_bindlessSrg = std::make_unique<BindlessSrg>(BindlessSrg({
@@ -430,7 +431,8 @@ namespace AtomSampleViewer
             RHI::InputStreamLayout layout;
             ModelLod::StreamBufferViewList streamBufferView;
             const ShaderVariant& shaderVariant = m_shader->GetVariant(RPI::ShaderAsset::RootShaderVariantStableId);
-            m_model->GetLods()[m_modelLod]->GetStreamsForMesh(layout, streamBufferView, shaderVariant.GetInputContract(), meshIndex);
+            AZ::RPI::UvStreamTangentIndex dummyUvStreamTangentIndex;
+            m_model->GetLods()[m_modelLod]->GetStreamsForMesh(layout, streamBufferView, dummyUvStreamTangentIndex, shaderVariant.GetInputContract(), meshIndex);
             // Set the pipeline state
             {
                 RHI::PipelineStateDescriptorForDraw pipelineStateDescriptor;
@@ -466,19 +468,15 @@ namespace AtomSampleViewer
         // Set the images
         {
             Data::Instance<AZ::RPI::ShaderResourceGroup> imageSrg = m_bindlessSrg->GetSrg(m_imageSrgName);
-            AZ::RHI::ShaderInputImageUnboundedArrayIndex imageIndex = imageSrg->FindShaderInputImageUnboundedArrayIndex(AZ::Name(textureArrayId));
+            AZ::RHI::ShaderInputImageIndex imageIndex = imageSrg->FindShaderInputImageIndex(AZ::Name(textureArrayId));
 
-            AZStd::vector<const RHI::ImageView*> imageViews;
-            for (uint32_t textureIdx = 0u; textureIdx < InternalBP::ImageCount; textureIdx++)
+            for (uint32_t textuerIdx = 0u; textuerIdx < InternalBP::ImageCount; textuerIdx++)
             {
-                AZ::Data::Instance<AZ::RPI::StreamingImage> image = LoadStreamingImage(InternalBP::Images[textureIdx], InternalBP::SampleName);
-                m_images.push_back(image);
-                imageViews.push_back(image->GetImageView());
+                AZ::Data::Instance<AZ::RPI::StreamingImage> image = LoadStreamingImage(InternalBP::Images[textuerIdx], InternalBP::SampleName);
+                [[maybe_unused]] bool result = imageSrg->SetImage(imageIndex, image, textuerIdx);
+                AZ_Assert(result, "Failed to set image into shader resource group.");
             }
 
-            [[maybe_unused]] bool result = imageSrg->SetImageViewUnboundedArray(imageIndex, imageViews);
-            AZ_Assert(result, "Failed to set image view unbounded array into shader resource group.");
-
             // Compile the image SRG
             imageSrg->Compile();
         }

+ 3 - 0
Gem/Code/Source/RHI/SubpassExampleComponent.cpp

@@ -262,9 +262,12 @@ namespace AtomSampleViewer
             {
                 Data::Instance<AZ::RPI::ModelLod> modelLod = m_models[modelData.m_modelType]->GetLods()[0];
 
+                AZ::RPI::UvStreamTangentIndex dummyUvStreamTangentIndex;
+
                 modelLod->GetStreamsForMesh(
                     pipelineDesc.m_inputStreamLayout,
                     modelData.m_streamBufferList,
+                    dummyUvStreamTangentIndex,
                     variant.GetInputContract(),
                     0);
 

+ 4 - 2
Gem/Code/Source/RootConstantsExampleComponent.cpp

@@ -95,7 +95,7 @@ namespace AtomSampleViewer
                 }
 
                 auto model = AZ::RPI::Model::FindOrCreate(modelAsset);
-                AZ_Error("Render", model, "Failed to load model %s", modelsPath[i]);               
+                AZ_Error("Render", model, "Failed to load model %s", modelsPath[i]);
 
                 m_models.push_back(AZStd::move(model));
             }
@@ -179,12 +179,14 @@ namespace AtomSampleViewer
                 if (model)
                 {
                     Data::Instance<AZ::RPI::ModelLod> modelLod = model->GetLods()[0];
+                    AZ::RPI::UvStreamTangentIndex dummyUvStreamTangentIndex;
+
                     m_modelStreamBufferViews[i].resize(modelLod->GetMeshes().size());
 
                     for (uint32_t j = 0; j < m_modelStreamBufferViews[i].size(); ++j)
                     {
                         modelLod->GetStreamsForMesh(
-                            pipelineStateDescriptor.m_inputStreamLayout, m_modelStreamBufferViews[i][j], shaderVariant.GetInputContract(),
+                            pipelineStateDescriptor.m_inputStreamLayout, m_modelStreamBufferViews[i][j], dummyUvStreamTangentIndex, shaderVariant.GetInputContract(),
                             j);
                     }
                 }