Formalize forward lighting contract
This commit is contained in:
@@ -561,6 +561,7 @@ BuiltinForwardPipeline::PassResourceLayout* BuiltinForwardPipeline::GetOrCreateP
|
||||
|
||||
passLayout.perObject = bindingPlan.perObject;
|
||||
passLayout.material = bindingPlan.material;
|
||||
passLayout.lighting = bindingPlan.lighting;
|
||||
passLayout.shadowReceiver = bindingPlan.shadowReceiver;
|
||||
passLayout.baseColorTexture = bindingPlan.baseColorTexture;
|
||||
passLayout.linearClampSampler = bindingPlan.linearClampSampler;
|
||||
@@ -570,6 +571,10 @@ BuiltinForwardPipeline::PassResourceLayout* BuiltinForwardPipeline::GetOrCreateP
|
||||
if (!passLayout.perObject.IsValid()) {
|
||||
return failLayout("BuiltinForwardPipeline requires a PerObject resource binding");
|
||||
}
|
||||
if (ShaderPassMatchesBuiltinPass(*resolvedShaderPass.pass, BuiltinMaterialPass::ForwardLit) &&
|
||||
!passLayout.lighting.IsValid()) {
|
||||
return failLayout("BuiltinForwardPipeline forward-lit pass requires a Lighting resource binding");
|
||||
}
|
||||
|
||||
std::vector<RHI::DescriptorSetLayoutDesc> nativeSetLayouts(passLayout.setLayouts.size());
|
||||
for (size_t i = 0; i < passLayout.setLayouts.size(); ++i) {
|
||||
@@ -718,6 +723,7 @@ BuiltinForwardPipeline::CachedDescriptorSet* BuiltinForwardPipeline::GetOrCreate
|
||||
Core::uint64 objectId,
|
||||
const Resources::Material* material,
|
||||
const MaterialConstantPayloadView& materialConstants,
|
||||
const LightingConstants& lightingConstants,
|
||||
const ShadowReceiverConstants& shadowReceiverConstants,
|
||||
RHI::RHIResourceView* baseColorTextureView,
|
||||
RHI::RHIResourceView* shadowMapTextureView) {
|
||||
@@ -750,6 +756,16 @@ BuiltinForwardPipeline::CachedDescriptorSet* BuiltinForwardPipeline::GetOrCreate
|
||||
}
|
||||
}
|
||||
|
||||
if (setLayout.usesLighting) {
|
||||
if (!passLayout.lighting.IsValid() || passLayout.lighting.set != setIndex) {
|
||||
return nullptr;
|
||||
}
|
||||
cachedDescriptorSet.descriptorSet.set->WriteConstant(
|
||||
passLayout.lighting.binding,
|
||||
&lightingConstants,
|
||||
sizeof(lightingConstants));
|
||||
}
|
||||
|
||||
if (setLayout.usesShadowReceiver) {
|
||||
if (!passLayout.shadowReceiver.IsValid() || passLayout.shadowReceiver.set != setIndex) {
|
||||
return nullptr;
|
||||
@@ -824,6 +840,7 @@ void BuiltinForwardPipeline::DestroyPassResourceLayout(PassResourceLayout& passL
|
||||
passLayout.descriptorSetCount = 0;
|
||||
passLayout.perObject = {};
|
||||
passLayout.material = {};
|
||||
passLayout.lighting = {};
|
||||
passLayout.shadowReceiver = {};
|
||||
passLayout.baseColorTexture = {};
|
||||
passLayout.linearClampSampler = {};
|
||||
@@ -872,7 +889,9 @@ bool BuiltinForwardPipeline::DrawVisibleItem(
|
||||
sceneData.cameraData.projection,
|
||||
sceneData.cameraData.view,
|
||||
visibleItem.localToWorld.Transpose(),
|
||||
visibleItem.localToWorld.Inverse(),
|
||||
visibleItem.localToWorld.Inverse()
|
||||
};
|
||||
const LightingConstants lightingConstants = {
|
||||
sceneData.lighting.HasMainDirectionalLight()
|
||||
? Math::Vector4(
|
||||
sceneData.lighting.mainDirectionalLight.direction.x,
|
||||
@@ -961,6 +980,7 @@ bool BuiltinForwardPipeline::DrawVisibleItem(
|
||||
RHI::RHIDescriptorSet* descriptorSet = nullptr;
|
||||
|
||||
if (setLayout.usesPerObject ||
|
||||
setLayout.usesLighting ||
|
||||
setLayout.usesMaterial ||
|
||||
setLayout.usesShadowReceiver ||
|
||||
setLayout.usesTexture) {
|
||||
@@ -979,6 +999,7 @@ bool BuiltinForwardPipeline::DrawVisibleItem(
|
||||
objectId,
|
||||
materialKey,
|
||||
materialConstants,
|
||||
lightingConstants,
|
||||
shadowReceiverConstants,
|
||||
baseColorTextureView,
|
||||
shadowMapTextureView);
|
||||
|
||||
Reference in New Issue
Block a user