Fix DeferredShading demo

This commit is contained in:
Jérôme Leclercq 2021-10-20 23:50:39 +02:00
parent e84ec8e4ac
commit a18415216b
8 changed files with 85 additions and 62 deletions

View File

@ -15,7 +15,7 @@ struct ViewerData
external external
{ {
[set(0), binding(0)] viewerData: uniform<ViewerData>, [set(0), binding(0)] viewerData: uniform<ViewerData>,
[set(1), binding(0)] colorTexture: sampler2D<f32>, [set(0), binding(1)] colorTexture: sampler2D<f32>,
} }
struct FragIn struct FragIn

View File

@ -15,8 +15,8 @@ struct ViewerData
external external
{ {
[set(0), binding(0)] viewerData: uniform<ViewerData>, [set(0), binding(0)] viewerData: uniform<ViewerData>,
[set(1), binding(0)] colorTexture: sampler2D<f32>, [set(0), binding(1)] colorTexture: sampler2D<f32>,
[set(1), binding(1)] bloomTexture: sampler2D<f32>, [set(0), binding(2)] bloomTexture: sampler2D<f32>,
} }
struct FragIn struct FragIn

View File

@ -32,11 +32,12 @@ struct ViewerData
external external
{ {
[set(0), binding(0)] viewerData: uniform<ViewerData>, [binding(0)] settings: uniform<BasicSettings>,
[set(1), binding(0)] instanceData: uniform<InstanceData>, [binding(1)] MaterialDiffuseMap: sampler2D<f32>,
[set(2), binding(0)] settings: uniform<BasicSettings>, [binding(2)] MaterialAlphaMap: sampler2D<f32>,
[set(2), binding(2)] MaterialAlphaMap: sampler2D<f32>, [binding(3)] TextureOverlay: sampler2D<f32>,
[set(2), binding(1)] MaterialDiffuseMap: sampler2D<f32> [binding(4)] instanceData: uniform<InstanceData>,
[binding(5)] viewerData: uniform<ViewerData>,
} }
struct InputData struct InputData

View File

@ -28,9 +28,9 @@ struct ViewerData
external external
{ {
[set(0), binding(0)] viewerData: uniform<ViewerData>, [binding(0)] settings: uniform<BasicSettings>,
[set(1), binding(0)] instanceData: uniform<InstanceData>, [binding(4)] instanceData: uniform<InstanceData>,
[set(2), binding(0)] settings: uniform<BasicSettings>, [binding(5)] viewerData: uniform<ViewerData>,
} }
struct InputData struct InputData

View File

@ -15,7 +15,7 @@ struct ViewerData
external external
{ {
[set(0), binding(0)] viewerData: uniform<ViewerData>, [set(0), binding(0)] viewerData: uniform<ViewerData>,
[set(1), binding(0)] colorTexture: sampler2D<f32>, [set(0), binding(1)] colorTexture: sampler2D<f32>,
} }
struct FragIn struct FragIn

View File

@ -41,19 +41,14 @@ struct ViewerData
[set(0)] [set(0)]
external external
{ {
[binding(0)] viewerData: uniform<ViewerData> [binding(0)] viewerData: uniform<ViewerData>,
[binding(1)] colorTexture: sampler2D<f32>,
[binding(2)] normalTexture: sampler2D<f32>,
[binding(3)] positionTexture: sampler2D<f32>,
} }
[set(1)] [set(1)]
external external
{
[binding(0)] colorTexture: sampler2D<f32>,
[binding(1)] normalTexture: sampler2D<f32>,
[binding(2)] positionTexture: sampler2D<f32>,
}
[set(2)]
external
{ {
[binding(0)] lightParameters: uniform<SpotLight>, [binding(0)] lightParameters: uniform<SpotLight>,
} }

View File

@ -14,7 +14,8 @@ struct ViewerData
external external
{ {
[set(1), binding(0)] skybox: samplerCube<f32> [binding(0)] viewerData: uniform<ViewerData>,
[binding(1)] skybox: samplerCube<f32>
} }
struct VertOut struct VertOut
@ -40,11 +41,6 @@ fn main(input: VertOut) -> FragOut
return output; return output;
} }
external
{
[set(0), binding(0)] viewerData: uniform<ViewerData>
}
struct VertIn struct VertIn
{ {
[location(0)] position: vec3<f32> [location(0)] position: vec3<f32>

View File

@ -129,11 +129,11 @@ int main()
std::shared_ptr<Nz::GraphicalMesh> cubeMeshGfx = std::make_shared<Nz::GraphicalMesh>(*cubeMesh); std::shared_ptr<Nz::GraphicalMesh> cubeMeshGfx = std::make_shared<Nz::GraphicalMesh>(*cubeMesh);
Nz::RenderPipelineLayoutInfo skyboxPipelineLayoutInfo; Nz::RenderPipelineLayoutInfo skyboxPipelineLayoutInfo;
Nz::Graphics::FillViewerPipelineLayout(skyboxPipelineLayoutInfo); Nz::Graphics::FillViewerPipelineLayout(skyboxPipelineLayoutInfo, 0);
auto& textureBinding = skyboxPipelineLayoutInfo.bindings.emplace_back(); auto& textureBinding = skyboxPipelineLayoutInfo.bindings.emplace_back();
textureBinding.setIndex = 1; textureBinding.setIndex = 0;
textureBinding.bindingIndex = 0; textureBinding.bindingIndex = 1;
textureBinding.shaderStageFlags = Nz::ShaderStageType::Fragment; textureBinding.shaderStageFlags = Nz::ShaderStageType::Fragment;
textureBinding.type = Nz::ShaderBindingType::Texture; textureBinding.type = Nz::ShaderBindingType::Texture;
@ -238,20 +238,20 @@ int main()
Nz::RenderPipelineLayoutInfo lightingPipelineLayoutInfo; Nz::RenderPipelineLayoutInfo lightingPipelineLayoutInfo;
Nz::Graphics::FillViewerPipelineLayout(lightingPipelineLayoutInfo); Nz::Graphics::FillViewerPipelineLayout(lightingPipelineLayoutInfo, 0);
for (unsigned int i = 0; i < 3; ++i) for (unsigned int i = 0; i < 3; ++i)
{ {
lightingPipelineLayoutInfo.bindings.push_back({ lightingPipelineLayoutInfo.bindings.push_back({
1, 0,
i, i + 1,
Nz::ShaderBindingType::Texture, Nz::ShaderBindingType::Texture,
Nz::ShaderStageType::Fragment, Nz::ShaderStageType::Fragment,
}); });
} }
lightingPipelineLayoutInfo.bindings.push_back({ lightingPipelineLayoutInfo.bindings.push_back({
2, 1,
0, 0,
Nz::ShaderBindingType::UniformBuffer, Nz::ShaderBindingType::UniformBuffer,
Nz::ShaderStageType::Fragment | Nz::ShaderStageType::Vertex, Nz::ShaderStageType::Fragment | Nz::ShaderStageType::Vertex,
@ -334,10 +334,10 @@ int main()
// Bloom data // Bloom data
Nz::RenderPipelineLayoutInfo bloomPipelineLayoutInfo; Nz::RenderPipelineLayoutInfo bloomPipelineLayoutInfo;
Nz::Graphics::FillViewerPipelineLayout(bloomPipelineLayoutInfo); Nz::Graphics::FillViewerPipelineLayout(bloomPipelineLayoutInfo, 0);
bloomPipelineLayoutInfo.bindings.push_back({ bloomPipelineLayoutInfo.bindings.push_back({
1, 0, 0, 1,
Nz::ShaderBindingType::Texture, Nz::ShaderBindingType::Texture,
Nz::ShaderStageType::Fragment, Nz::ShaderStageType::Fragment,
}); });
@ -362,16 +362,16 @@ int main()
Nz::RenderPipelineLayoutInfo bloomBlendPipelineLayoutInfo; Nz::RenderPipelineLayoutInfo bloomBlendPipelineLayoutInfo;
Nz::Graphics::FillViewerPipelineLayout(bloomBlendPipelineLayoutInfo); Nz::Graphics::FillViewerPipelineLayout(bloomBlendPipelineLayoutInfo, 0);
bloomBlendPipelineLayoutInfo.bindings.push_back({ bloomBlendPipelineLayoutInfo.bindings.push_back({
1, 0, 0, 1,
Nz::ShaderBindingType::Texture, Nz::ShaderBindingType::Texture,
Nz::ShaderStageType::Fragment, Nz::ShaderStageType::Fragment,
}); });
bloomBlendPipelineLayoutInfo.bindings.push_back({ bloomBlendPipelineLayoutInfo.bindings.push_back({
1, 1, 0, 2,
Nz::ShaderBindingType::Texture, Nz::ShaderBindingType::Texture,
Nz::ShaderStageType::Fragment, Nz::ShaderStageType::Fragment,
}); });
@ -519,10 +519,17 @@ int main()
std::shared_ptr<Nz::TextureSampler> textureSampler = device->InstantiateTextureSampler({}); std::shared_ptr<Nz::TextureSampler> textureSampler = device->InstantiateTextureSampler({});
std::shared_ptr<Nz::ShaderBinding> skyboxShaderBinding = skyboxPipelineLayout->AllocateShaderBinding(1); std::shared_ptr<Nz::ShaderBinding> skyboxShaderBinding = skyboxPipelineLayout->AllocateShaderBinding(0);
skyboxShaderBinding->Update({ skyboxShaderBinding->Update({
{ {
0, 0,
Nz::ShaderBinding::UniformBufferBinding {
viewerInstance.GetViewerBuffer().get(),
0, viewerInstance.GetViewerBuffer()->GetSize()
}
},
{
1,
Nz::ShaderBinding::TextureBinding { Nz::ShaderBinding::TextureBinding {
skyboxTexture.get(), skyboxTexture.get(),
textureSampler.get() textureSampler.get()
@ -645,8 +652,6 @@ int main()
builder.SetScissor(renderArea); builder.SetScissor(renderArea);
builder.SetViewport(renderArea); builder.SetViewport(renderArea);
builder.BindShaderBinding(Nz::Graphics::ViewerBindingSet, viewerInstance.GetShaderBinding());
std::vector<std::unique_ptr<Nz::RenderElement>> elements; std::vector<std::unique_ptr<Nz::RenderElement>> elements;
spaceshipModel.BuildElement(forwardPassIndex, modelInstance1, elements); spaceshipModel.BuildElement(forwardPassIndex, modelInstance1, elements);
spaceshipModel.BuildElement(forwardPassIndex, modelInstance2, elements); spaceshipModel.BuildElement(forwardPassIndex, modelInstance2, elements);
@ -656,7 +661,10 @@ int main()
for (const auto& element : elements) for (const auto& element : elements)
elementPointers.emplace_back(element.get()); elementPointers.emplace_back(element.get());
submeshRenderer.Render(*submeshRendererData, builder, elementPointers.data(), elementPointers.size()); Nz::RenderFrame dummy;
submeshRenderer.Prepare(viewerInstance, *submeshRendererData, dummy, elementPointers.data(), elementPointers.size());
submeshRenderer.Render(viewerInstance, *submeshRendererData, builder, elementPointers.data(), elementPointers.size());
}); });
Nz::FramePass& lightingPass = graph.AddPass("Lighting pass"); Nz::FramePass& lightingPass = graph.AddPass("Lighting pass");
@ -674,12 +682,11 @@ int main()
builder.BindIndexBuffer(*coneMeshGfx->GetIndexBuffer(0).get()); builder.BindIndexBuffer(*coneMeshGfx->GetIndexBuffer(0).get());
builder.BindVertexBuffer(0, *coneMeshGfx->GetVertexBuffer(0).get()); builder.BindVertexBuffer(0, *coneMeshGfx->GetVertexBuffer(0).get());
builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(0, *gbufferShaderBinding);
builder.BindShaderBinding(1, *gbufferShaderBinding);
for (std::size_t i = 0; i < spotLights.size(); ++i) for (std::size_t i = 0; i < spotLights.size(); ++i)
{ {
builder.BindShaderBinding(2, *lightingShaderBindings[i]); builder.BindShaderBinding(1, *lightingShaderBindings[i]);
builder.BindPipeline(*stencilPipeline); builder.BindPipeline(*stencilPipeline);
builder.DrawIndexed(coneMeshGfx->GetIndexCount(0)); builder.DrawIndexed(coneMeshGfx->GetIndexCount(0));
@ -702,8 +709,7 @@ int main()
builder.SetScissor(renderArea); builder.SetScissor(renderArea);
builder.SetViewport(renderArea); builder.SetViewport(renderArea);
builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(0, *skyboxShaderBinding);
builder.BindShaderBinding(1, *skyboxShaderBinding);
builder.BindIndexBuffer(*cubeMeshGfx->GetIndexBuffer(0)); builder.BindIndexBuffer(*cubeMeshGfx->GetIndexBuffer(0));
builder.BindVertexBuffer(0, *cubeMeshGfx->GetVertexBuffer(0)); builder.BindVertexBuffer(0, *cubeMeshGfx->GetVertexBuffer(0));
@ -727,8 +733,7 @@ int main()
builder.SetScissor(renderArea); builder.SetScissor(renderArea);
builder.SetViewport(renderArea); builder.SetViewport(renderArea);
builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(0, *bloomBrightShaderBinding);
builder.BindShaderBinding(1, *bloomBrightShaderBinding);
builder.BindPipeline(*bloomBrightPipeline); builder.BindPipeline(*bloomBrightPipeline);
builder.BindVertexBuffer(0, *fullscreenVertexBuffer); builder.BindVertexBuffer(0, *fullscreenVertexBuffer);
@ -749,8 +754,7 @@ int main()
builder.SetScissor(renderArea); builder.SetScissor(renderArea);
builder.SetViewport(renderArea); builder.SetViewport(renderArea);
builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(0, *gaussianBlurShaderBinding);
builder.BindShaderBinding(1, *gaussianBlurShaderBinding);
builder.BindPipeline(*gaussianBlurPipeline); builder.BindPipeline(*gaussianBlurPipeline);
builder.BindVertexBuffer(0, *fullscreenVertexBuffer); builder.BindVertexBuffer(0, *fullscreenVertexBuffer);
@ -770,8 +774,7 @@ int main()
builder.SetScissor(renderArea); builder.SetScissor(renderArea);
builder.SetViewport(renderArea); builder.SetViewport(renderArea);
builder.BindShaderBinding(0, viewerInstance.GetShaderBinding()); builder.BindShaderBinding(0, *bloomBlendShaderBinding);
builder.BindShaderBinding(1, *bloomBlendShaderBinding);
builder.BindPipeline(*bloomBlendPipeline); builder.BindPipeline(*bloomBlendPipeline);
builder.BindVertexBuffer(0, *fullscreenVertexBuffer); builder.BindVertexBuffer(0, *fullscreenVertexBuffer);
@ -936,24 +939,31 @@ int main()
{ {
frame.PushForRelease(std::move(gbufferShaderBinding)); frame.PushForRelease(std::move(gbufferShaderBinding));
gbufferShaderBinding = lightingPipelineInfo.pipelineLayout->AllocateShaderBinding(1); gbufferShaderBinding = lightingPipelineInfo.pipelineLayout->AllocateShaderBinding(0);
gbufferShaderBinding->Update({ gbufferShaderBinding->Update({
{ {
0, 0,
Nz::ShaderBinding::UniformBufferBinding {
viewerInstance.GetViewerBuffer().get(),
0, viewerInstance.GetViewerBuffer()->GetSize()
}
},
{
1,
Nz::ShaderBinding::TextureBinding { Nz::ShaderBinding::TextureBinding {
bakedGraph.GetAttachmentTexture(colorTexture).get(), bakedGraph.GetAttachmentTexture(colorTexture).get(),
textureSampler.get() textureSampler.get()
} }
}, },
{ {
1, 2,
Nz::ShaderBinding::TextureBinding { Nz::ShaderBinding::TextureBinding {
bakedGraph.GetAttachmentTexture(normalTexture).get(), bakedGraph.GetAttachmentTexture(normalTexture).get(),
textureSampler.get() textureSampler.get()
} }
}, },
{ {
2, 3,
Nz::ShaderBinding::TextureBinding { Nz::ShaderBinding::TextureBinding {
bakedGraph.GetAttachmentTexture(positionTexture).get(), bakedGraph.GetAttachmentTexture(positionTexture).get(),
textureSampler.get() textureSampler.get()
@ -966,7 +976,7 @@ int main()
for (std::size_t i = 0; i < MaxPointLight; ++i) for (std::size_t i = 0; i < MaxPointLight; ++i)
{ {
std::shared_ptr<Nz::ShaderBinding> lightingShaderBinding = lightingPipelineInfo.pipelineLayout->AllocateShaderBinding(2); std::shared_ptr<Nz::ShaderBinding> lightingShaderBinding = lightingPipelineInfo.pipelineLayout->AllocateShaderBinding(1);
lightingShaderBinding->Update({ lightingShaderBinding->Update({
{ {
0, 0,
@ -982,10 +992,17 @@ int main()
frame.PushForRelease(std::move(bloomBrightShaderBinding)); frame.PushForRelease(std::move(bloomBrightShaderBinding));
bloomBrightShaderBinding = bloomPipelineInfo.pipelineLayout->AllocateShaderBinding(1); bloomBrightShaderBinding = bloomPipelineInfo.pipelineLayout->AllocateShaderBinding(0);
bloomBrightShaderBinding->Update({ bloomBrightShaderBinding->Update({
{ {
0, 0,
Nz::ShaderBinding::UniformBufferBinding {
viewerInstance.GetViewerBuffer().get(),
0, viewerInstance.GetViewerBuffer()->GetSize()
}
},
{
1,
Nz::ShaderBinding::TextureBinding { Nz::ShaderBinding::TextureBinding {
bakedGraph.GetAttachmentTexture(lightOutput).get(), bakedGraph.GetAttachmentTexture(lightOutput).get(),
textureSampler.get() textureSampler.get()
@ -995,10 +1012,17 @@ int main()
frame.PushForRelease(std::move(gaussianBlurShaderBinding)); frame.PushForRelease(std::move(gaussianBlurShaderBinding));
gaussianBlurShaderBinding = bloomPipelineInfo.pipelineLayout->AllocateShaderBinding(1); gaussianBlurShaderBinding = bloomPipelineInfo.pipelineLayout->AllocateShaderBinding(0);
gaussianBlurShaderBinding->Update({ gaussianBlurShaderBinding->Update({
{ {
0, 0,
Nz::ShaderBinding::UniformBufferBinding {
viewerInstance.GetViewerBuffer().get(),
0, viewerInstance.GetViewerBuffer()->GetSize()
}
},
{
1,
Nz::ShaderBinding::TextureBinding { Nz::ShaderBinding::TextureBinding {
bakedGraph.GetAttachmentTexture(bloomTextureA).get(), bakedGraph.GetAttachmentTexture(bloomTextureA).get(),
textureSampler.get() textureSampler.get()
@ -1008,17 +1032,24 @@ int main()
frame.PushForRelease(std::move(bloomBlendShaderBinding)); frame.PushForRelease(std::move(bloomBlendShaderBinding));
bloomBlendShaderBinding = bloomBlendPipelineInfo.pipelineLayout->AllocateShaderBinding(1); bloomBlendShaderBinding = bloomBlendPipelineInfo.pipelineLayout->AllocateShaderBinding(0);
bloomBlendShaderBinding->Update({ bloomBlendShaderBinding->Update({
{ {
0, 0,
Nz::ShaderBinding::UniformBufferBinding {
viewerInstance.GetViewerBuffer().get(),
0, viewerInstance.GetViewerBuffer()->GetSize()
}
},
{
1,
Nz::ShaderBinding::TextureBinding { Nz::ShaderBinding::TextureBinding {
bakedGraph.GetAttachmentTexture(lightOutput).get(), bakedGraph.GetAttachmentTexture(lightOutput).get(),
textureSampler.get() textureSampler.get()
} }
}, },
{ {
1, 2,
Nz::ShaderBinding::TextureBinding { Nz::ShaderBinding::TextureBinding {
bakedGraph.GetAttachmentTexture(bloomTextureB).get(), bakedGraph.GetAttachmentTexture(bloomTextureB).get(),
textureSampler.get() textureSampler.get()