Examples/DeferredShading: Add flare sprite
This commit is contained in:
parent
d4dfe97006
commit
0aff946665
|
|
@ -197,6 +197,26 @@ int main()
|
||||||
}
|
}
|
||||||
spaceshipMat->AddPass("ForwardPass", spaceshipMatPass);
|
spaceshipMat->AddPass("ForwardPass", spaceshipMatPass);
|
||||||
|
|
||||||
|
std::shared_ptr<Nz::Material> flareMaterial = std::make_shared<Nz::Material>();
|
||||||
|
std::shared_ptr<Nz::MaterialPass> flareMaterialPass;
|
||||||
|
{
|
||||||
|
flareMaterialPass = std::make_shared<Nz::MaterialPass>(customMatSettings);
|
||||||
|
flareMaterialPass->EnableDepthBuffer(true);
|
||||||
|
flareMaterialPass->EnableDepthWrite(false);
|
||||||
|
flareMaterialPass->EnableDepthClamp(true);
|
||||||
|
|
||||||
|
flareMaterialPass->EnableFlag(Nz::MaterialPassFlag::SortByDistance);
|
||||||
|
|
||||||
|
flareMaterialPass->EnableBlending(true);
|
||||||
|
flareMaterialPass->SetBlendEquation(Nz::BlendEquation::Add, Nz::BlendEquation::Add);
|
||||||
|
flareMaterialPass->SetBlendFunc(Nz::BlendFunc::SrcAlpha, Nz::BlendFunc::InvSrcAlpha, Nz::BlendFunc::One, Nz::BlendFunc::Zero);
|
||||||
|
|
||||||
|
Nz::BasicMaterial Osef(*flareMaterialPass);
|
||||||
|
Osef.SetDiffuseMap(Nz::Texture::LoadFromFile(resourceDir / "flare1.png", texParams));
|
||||||
|
|
||||||
|
flareMaterial->AddPass("ForwardPass", flareMaterialPass);
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<Nz::Material> planeMat = std::make_shared<Nz::Material>();
|
std::shared_ptr<Nz::Material> planeMat = std::make_shared<Nz::Material>();
|
||||||
|
|
||||||
std::shared_ptr<Nz::MaterialPass> planeMatPass = std::make_shared<Nz::MaterialPass>(customMatSettings);
|
std::shared_ptr<Nz::MaterialPass> planeMatPass = std::make_shared<Nz::MaterialPass>(customMatSettings);
|
||||||
|
|
@ -529,8 +549,8 @@ int main()
|
||||||
|
|
||||||
std::vector<Nz::UInt8> godRaysData(godraysFieldOffsets.GetSize());
|
std::vector<Nz::UInt8> godRaysData(godraysFieldOffsets.GetSize());
|
||||||
Nz::AccessByOffset<float&>(godRaysData.data(), gr_exposureOffset) = 0.0034f;
|
Nz::AccessByOffset<float&>(godRaysData.data(), gr_exposureOffset) = 0.0034f;
|
||||||
Nz::AccessByOffset<float&>(godRaysData.data(), gr_decayOffset) = 0.9f;
|
Nz::AccessByOffset<float&>(godRaysData.data(), gr_decayOffset) = 0.99f;
|
||||||
Nz::AccessByOffset<float&>(godRaysData.data(), gr_densityOffset) = 0.84f;
|
Nz::AccessByOffset<float&>(godRaysData.data(), gr_densityOffset) = 0.95f;
|
||||||
Nz::AccessByOffset<float&>(godRaysData.data(), gr_weightOffset) = 5.65f;
|
Nz::AccessByOffset<float&>(godRaysData.data(), gr_weightOffset) = 5.65f;
|
||||||
Nz::AccessByOffset<Nz::Vector2f&>(godRaysData.data(), gr_lightPositionOffset) = Nz::Vector2f(0.5f, 0.1f);
|
Nz::AccessByOffset<Nz::Vector2f&>(godRaysData.data(), gr_lightPositionOffset) = Nz::Vector2f(0.5f, 0.1f);
|
||||||
|
|
||||||
|
|
@ -684,11 +704,26 @@ int main()
|
||||||
|
|
||||||
std::size_t toneMappingOutput;
|
std::size_t toneMappingOutput;
|
||||||
|
|
||||||
|
Nz::SpriteChainRenderer spritechainRenderer(*device);
|
||||||
|
std::unique_ptr<Nz::ElementRendererData> spriteRendererData = spritechainRenderer.InstanciateData();
|
||||||
|
|
||||||
|
Nz::Sprite flareSprite(flareMaterial);
|
||||||
|
flareSprite.SetSize({ 128.f, 128.f });
|
||||||
|
flareSprite.SetSize(flareSprite.GetSize() * 0.1f);
|
||||||
|
flareSprite.SetOrigin(flareSprite.GetSize() / 2.f);
|
||||||
|
|
||||||
|
Nz::Vector3f flarePosition = { 0.f, 6.f, 100.f };
|
||||||
|
|
||||||
|
Nz::WorldInstance flareInstance;
|
||||||
|
flareInstance.UpdateWorldMatrix(Nz::Matrix4f::Translate(flarePosition));
|
||||||
|
|
||||||
Nz::SubmeshRenderer submeshRenderer;
|
Nz::SubmeshRenderer submeshRenderer;
|
||||||
std::unique_ptr<Nz::ElementRendererData> submeshRendererData = submeshRenderer.InstanciateData();
|
std::unique_ptr<Nz::ElementRendererData> submeshRendererData = submeshRenderer.InstanciateData();
|
||||||
|
|
||||||
std::size_t forwardPassIndex = Nz::Graphics::Instance()->GetMaterialPassRegistry().GetPassIndex("ForwardPass");
|
std::size_t forwardPassIndex = Nz::Graphics::Instance()->GetMaterialPassRegistry().GetPassIndex("ForwardPass");
|
||||||
|
|
||||||
|
Nz::RenderFrame* currentFrame = nullptr;
|
||||||
|
|
||||||
Nz::BakedFrameGraph bakedGraph = [&]
|
Nz::BakedFrameGraph bakedGraph = [&]
|
||||||
{
|
{
|
||||||
Nz::PixelFormat depthStencilFormat = Nz::PixelFormat::Undefined;
|
Nz::PixelFormat depthStencilFormat = Nz::PixelFormat::Undefined;
|
||||||
|
|
@ -746,7 +781,9 @@ int main()
|
||||||
|
|
||||||
godRaysTexture = graph.AddAttachment({
|
godRaysTexture = graph.AddAttachment({
|
||||||
"God rays texture",
|
"God rays texture",
|
||||||
Nz::PixelFormat::RGBA16F
|
Nz::PixelFormat::RGBA16F,
|
||||||
|
50'000,
|
||||||
|
50'000
|
||||||
});
|
});
|
||||||
|
|
||||||
bloomOutput = graph.AddAttachmentProxy("Bloom output", lightOutput);
|
bloomOutput = graph.AddAttachmentProxy("Bloom output", lightOutput);
|
||||||
|
|
@ -823,9 +860,7 @@ int main()
|
||||||
for (const auto& element : elements)
|
for (const auto& element : elements)
|
||||||
elementPointers.emplace_back(element.get());
|
elementPointers.emplace_back(element.get());
|
||||||
|
|
||||||
Nz::RenderFrame dummy;
|
submeshRenderer.Prepare(viewerInstance, *submeshRendererData, *currentFrame, elementPointers.data(), elementPointers.size());
|
||||||
|
|
||||||
submeshRenderer.Prepare(viewerInstance, *submeshRendererData, dummy, elementPointers.data(), elementPointers.size());
|
|
||||||
submeshRenderer.Render(viewerInstance, *submeshRendererData, builder, elementPointers.data(), elementPointers.size());
|
submeshRenderer.Render(viewerInstance, *submeshRendererData, builder, elementPointers.data(), elementPointers.size());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -878,6 +913,17 @@ int main()
|
||||||
builder.BindPipeline(*skyboxPipeline);
|
builder.BindPipeline(*skyboxPipeline);
|
||||||
|
|
||||||
builder.DrawIndexed(Nz::SafeCast<Nz::UInt32>(cubeMeshGfx->GetIndexCount(0)));
|
builder.DrawIndexed(Nz::SafeCast<Nz::UInt32>(cubeMeshGfx->GetIndexCount(0)));
|
||||||
|
|
||||||
|
std::vector<std::unique_ptr<Nz::RenderElement>> elements;
|
||||||
|
flareSprite.BuildElement(forwardPassIndex, flareInstance, elements);
|
||||||
|
|
||||||
|
std::vector<Nz::Pointer<const Nz::RenderElement>> elementPointers;
|
||||||
|
elementPointers.reserve(elements.size());
|
||||||
|
for (const auto& element : elements)
|
||||||
|
elementPointers.emplace_back(element.get());
|
||||||
|
|
||||||
|
spritechainRenderer.Prepare(viewerInstance, *spriteRendererData, *currentFrame, elementPointers.data(), elementPointers.size());
|
||||||
|
spritechainRenderer.Render(viewerInstance, *spriteRendererData, builder, elementPointers.data(), elementPointers.size());
|
||||||
});
|
});
|
||||||
forwardPass.SetExecutionCallback([&]
|
forwardPass.SetExecutionCallback([&]
|
||||||
{
|
{
|
||||||
|
|
@ -896,13 +942,16 @@ int main()
|
||||||
builder.SetScissor(renderArea);
|
builder.SetScissor(renderArea);
|
||||||
builder.SetViewport(renderArea);
|
builder.SetViewport(renderArea);
|
||||||
|
|
||||||
builder.BindShaderBinding(0, *skyboxShaderBinding);
|
std::vector<std::unique_ptr<Nz::RenderElement>> elements;
|
||||||
|
flareSprite.BuildElement(forwardPassIndex, flareInstance, elements);
|
||||||
|
|
||||||
builder.BindIndexBuffer(*cubeMeshGfx->GetIndexBuffer(0));
|
std::vector<Nz::Pointer<const Nz::RenderElement>> elementPointers;
|
||||||
builder.BindVertexBuffer(0, *cubeMeshGfx->GetVertexBuffer(0));
|
elementPointers.reserve(elements.size());
|
||||||
builder.BindPipeline(*skyboxPipeline);
|
for (const auto& element : elements)
|
||||||
|
elementPointers.emplace_back(element.get());
|
||||||
|
|
||||||
builder.DrawIndexed(Nz::SafeCast<Nz::UInt32>(cubeMeshGfx->GetIndexCount(0)));
|
spritechainRenderer.Prepare(viewerInstance, *spriteRendererData, *currentFrame, elementPointers.data(), elementPointers.size());
|
||||||
|
spritechainRenderer.Render(viewerInstance, *spriteRendererData, builder, elementPointers.data(), elementPointers.size());
|
||||||
});
|
});
|
||||||
|
|
||||||
occluderPass.AddOutput(occluderTexture);
|
occluderPass.AddOutput(occluderTexture);
|
||||||
|
|
@ -926,7 +975,6 @@ int main()
|
||||||
godraysPass.AddInput(occluderTexture);
|
godraysPass.AddInput(occluderTexture);
|
||||||
godraysPass.AddOutput(godRaysTexture);
|
godraysPass.AddOutput(godRaysTexture);
|
||||||
|
|
||||||
|
|
||||||
Nz::FramePass& bloomBrightPass = graph.AddPass("Bloom pass - extract bright pixels");
|
Nz::FramePass& bloomBrightPass = graph.AddPass("Bloom pass - extract bright pixels");
|
||||||
bloomBrightPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea)
|
bloomBrightPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder, const Nz::Recti& renderArea)
|
||||||
{
|
{
|
||||||
|
|
@ -1190,6 +1238,8 @@ int main()
|
||||||
if (!frame)
|
if (!frame)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
currentFrame = &frame;
|
||||||
|
|
||||||
if (bakedGraph.Resize(frame))
|
if (bakedGraph.Resize(frame))
|
||||||
{
|
{
|
||||||
frame.PushForRelease(std::move(gbufferShaderBinding));
|
frame.PushForRelease(std::move(gbufferShaderBinding));
|
||||||
|
|
@ -1452,6 +1502,10 @@ int main()
|
||||||
modelInstance2.UpdateBuffers(uploadPool, builder);
|
modelInstance2.UpdateBuffers(uploadPool, builder);
|
||||||
planeInstance.UpdateBuffers(uploadPool, builder);
|
planeInstance.UpdateBuffers(uploadPool, builder);
|
||||||
|
|
||||||
|
Nz::EulerAnglesf flareRotation(0.f, 0.f, elapsedTime * 10.f);
|
||||||
|
flareInstance.UpdateWorldMatrix(Nz::Matrix4f::Transform(viewerPos + flarePosition, flareRotation));
|
||||||
|
flareInstance.UpdateBuffers(uploadPool, builder);
|
||||||
|
|
||||||
viewerInstance.UpdateBuffers(uploadPool, builder);
|
viewerInstance.UpdateBuffers(uploadPool, builder);
|
||||||
|
|
||||||
// Update light buffer
|
// Update light buffer
|
||||||
|
|
@ -1487,7 +1541,7 @@ int main()
|
||||||
|
|
||||||
// Update light scattering buffer
|
// Update light scattering buffer
|
||||||
{
|
{
|
||||||
Nz::Vector4f pos(0.f, 200.f, 0.f, 1.f);
|
Nz::Vector4f pos(flareInstance.GetWorldMatrix().GetTranslation(), 1.f);
|
||||||
pos = viewerInstance.GetViewMatrix() * pos;
|
pos = viewerInstance.GetViewMatrix() * pos;
|
||||||
pos = viewerInstance.GetProjectionMatrix() * pos;
|
pos = viewerInstance.GetProjectionMatrix() * pos;
|
||||||
pos /= pos.w;
|
pos /= pos.w;
|
||||||
|
|
@ -1507,6 +1561,7 @@ int main()
|
||||||
|
|
||||||
matUpdate = spaceshipMatPass->Update(frame, builder) || matUpdate;
|
matUpdate = spaceshipMatPass->Update(frame, builder) || matUpdate;
|
||||||
matUpdate = planeMatPass->Update(frame, builder) || matUpdate;
|
matUpdate = planeMatPass->Update(frame, builder) || matUpdate;
|
||||||
|
matUpdate = flareMaterialPass->Update(frame, builder) || matUpdate;
|
||||||
|
|
||||||
builder.PostTransferBarrier();
|
builder.PostTransferBarrier();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue