DeferredShading demo: Add a skybox
This commit is contained in:
parent
6fe7e5b16b
commit
56b8d83bab
|
|
@ -0,0 +1,67 @@
|
||||||
|
[layout(std140)]
|
||||||
|
struct ViewerData
|
||||||
|
{
|
||||||
|
projectionMatrix: mat4<f32>,
|
||||||
|
invProjectionMatrix: mat4<f32>,
|
||||||
|
viewMatrix: mat4<f32>,
|
||||||
|
invViewMatrix: mat4<f32>,
|
||||||
|
viewProjMatrix: mat4<f32>,
|
||||||
|
invViewProjMatrix: mat4<f32>,
|
||||||
|
renderTargetSize: vec2<f32>,
|
||||||
|
invRenderTargetSize: vec2<f32>,
|
||||||
|
eyePosition: vec3<f32>
|
||||||
|
}
|
||||||
|
|
||||||
|
external
|
||||||
|
{
|
||||||
|
[binding(1)] skybox: samplerCube<f32>
|
||||||
|
}
|
||||||
|
|
||||||
|
struct VertOut
|
||||||
|
{
|
||||||
|
[location(0)] uvw: vec3<f32>,
|
||||||
|
[builtin(position)] position: vec4<f32>
|
||||||
|
}
|
||||||
|
|
||||||
|
struct FragOut
|
||||||
|
{
|
||||||
|
[location(0)] color: vec4<f32>,
|
||||||
|
[builtin(fragdepth)] depth: f32
|
||||||
|
}
|
||||||
|
|
||||||
|
[entry(frag)]
|
||||||
|
[depth_write(greater)]
|
||||||
|
fn main(input: VertOut) -> FragOut
|
||||||
|
{
|
||||||
|
let output: FragOut;
|
||||||
|
output.color = skybox.Sample(input.uvw);
|
||||||
|
output.depth = 1.0;
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
external
|
||||||
|
{
|
||||||
|
[binding(0)] viewerData: uniform<ViewerData>
|
||||||
|
}
|
||||||
|
|
||||||
|
struct VertIn
|
||||||
|
{
|
||||||
|
[location(0)] position: vec3<f32>
|
||||||
|
}
|
||||||
|
|
||||||
|
[entry(vert)]
|
||||||
|
fn main(input: VertIn) -> VertOut
|
||||||
|
{
|
||||||
|
// Set translation part to zero
|
||||||
|
let rotationMat = viewerData.viewMatrix;
|
||||||
|
rotationMat[3][0] = 0.0;
|
||||||
|
rotationMat[3][1] = 0.0;
|
||||||
|
rotationMat[3][2] = 0.0;
|
||||||
|
|
||||||
|
let output: VertOut;
|
||||||
|
output.position = viewerData.projectionMatrix * rotationMat * vec4<f32>(input.position, 1.0);
|
||||||
|
output.uvw = vec3<f32>(input.position.xy * -1.0, input.position.z);
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
@ -108,6 +108,7 @@ int main()
|
||||||
texParams.renderDevice = device;
|
texParams.renderDevice = device;
|
||||||
texParams.loadFormat = Nz::PixelFormat::RGBA8_SRGB;
|
texParams.loadFormat = Nz::PixelFormat::RGBA8_SRGB;
|
||||||
|
|
||||||
|
// Plane
|
||||||
Nz::MeshParams meshPrimitiveParams;
|
Nz::MeshParams meshPrimitiveParams;
|
||||||
meshPrimitiveParams.storage = Nz::DataStorage::Software;
|
meshPrimitiveParams.storage = Nz::DataStorage::Software;
|
||||||
|
|
||||||
|
|
@ -119,8 +120,49 @@ int main()
|
||||||
|
|
||||||
std::shared_ptr<Nz::GraphicalMesh> planeMeshGfx = std::make_shared<Nz::GraphicalMesh>(*planeMesh);
|
std::shared_ptr<Nz::GraphicalMesh> planeMeshGfx = std::make_shared<Nz::GraphicalMesh>(*planeMesh);
|
||||||
|
|
||||||
|
// Skybox
|
||||||
meshPrimitiveParams.vertexDeclaration = Nz::VertexDeclaration::Get(Nz::VertexLayout::XYZ);
|
meshPrimitiveParams.vertexDeclaration = Nz::VertexDeclaration::Get(Nz::VertexLayout::XYZ);
|
||||||
|
|
||||||
|
std::shared_ptr<Nz::Mesh> cubeMesh = std::make_shared<Nz::Mesh>();
|
||||||
|
cubeMesh->CreateStatic();
|
||||||
|
cubeMesh->BuildSubMesh(Nz::Primitive::Box(Nz::Vector3f::Unit(), Nz::Vector3ui(0), Nz::Matrix4f::Scale({ 1.f, -1.f, 1.f })), meshPrimitiveParams);
|
||||||
|
cubeMesh->SetMaterialCount(1);
|
||||||
|
|
||||||
|
std::shared_ptr<Nz::GraphicalMesh> cubeMeshGfx = std::make_shared<Nz::GraphicalMesh>(*cubeMesh);
|
||||||
|
|
||||||
|
Nz::RenderPipelineLayoutInfo pipelineLayoutInfo;
|
||||||
|
auto& uboBinding = pipelineLayoutInfo.bindings.emplace_back();
|
||||||
|
uboBinding.index = 0;
|
||||||
|
uboBinding.shaderStageFlags = Nz::ShaderStageType::Vertex;
|
||||||
|
uboBinding.type = Nz::ShaderBindingType::UniformBuffer;
|
||||||
|
|
||||||
|
auto& textureBinding = pipelineLayoutInfo.bindings.emplace_back();
|
||||||
|
textureBinding.index = 1;
|
||||||
|
textureBinding.shaderStageFlags = Nz::ShaderStageType::Fragment;
|
||||||
|
textureBinding.type = Nz::ShaderBindingType::Texture;
|
||||||
|
|
||||||
|
std::shared_ptr<Nz::RenderPipelineLayout> skyboxPipelineLayout = device->InstantiateRenderPipelineLayout(std::move(pipelineLayoutInfo));
|
||||||
|
|
||||||
|
Nz::RenderPipelineInfo skyboxPipelineInfo;
|
||||||
|
skyboxPipelineInfo.depthBuffer = true;
|
||||||
|
skyboxPipelineInfo.depthCompare = Nz::RendererComparison::Equal;
|
||||||
|
skyboxPipelineInfo.faceCulling = true;
|
||||||
|
skyboxPipelineInfo.cullingSide = Nz::FaceSide::Front;
|
||||||
|
skyboxPipelineInfo.pipelineLayout = skyboxPipelineLayout;
|
||||||
|
skyboxPipelineInfo.shaderModules.push_back(device->InstantiateShaderModule(Nz::ShaderStageType::Fragment | Nz::ShaderStageType::Vertex, Nz::ShaderLanguage::NazaraShader, resourceDir / "skybox.nzsl", {}));
|
||||||
|
skyboxPipelineInfo.vertexBuffers.push_back({
|
||||||
|
0,
|
||||||
|
meshPrimitiveParams.vertexDeclaration
|
||||||
|
});
|
||||||
|
|
||||||
|
std::shared_ptr<Nz::RenderPipeline> skyboxPipeline = device->InstantiateRenderPipeline(std::move(skyboxPipelineInfo));
|
||||||
|
|
||||||
|
Nz::TextureParams skyboxTexParams;
|
||||||
|
skyboxTexParams.renderDevice = device;
|
||||||
|
|
||||||
|
std::shared_ptr<Nz::Texture> skyboxTexture = Nz::Texture::LoadCubemapFromFile(resourceDir / "skybox-space.png", skyboxTexParams);
|
||||||
|
|
||||||
|
// Cone mesh
|
||||||
std::shared_ptr<Nz::Mesh> coneMesh = std::make_shared<Nz::Mesh>();
|
std::shared_ptr<Nz::Mesh> coneMesh = std::make_shared<Nz::Mesh>();
|
||||||
coneMesh->CreateStatic();
|
coneMesh->CreateStatic();
|
||||||
coneMesh->BuildSubMesh(Nz::Primitive::Cone(1.f, 1.f, 16, Nz::Matrix4f::Rotate(Nz::EulerAnglesf(90.f, 0.f, 0.f))), meshPrimitiveParams);
|
coneMesh->BuildSubMesh(Nz::Primitive::Cone(1.f, 1.f, 16, Nz::Matrix4f::Rotate(Nz::EulerAnglesf(90.f, 0.f, 0.f))), meshPrimitiveParams);
|
||||||
|
|
@ -436,7 +478,28 @@ int main()
|
||||||
|
|
||||||
bool viewerUboUpdate = true;
|
bool viewerUboUpdate = true;
|
||||||
|
|
||||||
Nz::BakedFrameGraph bakedGraph = [&]{
|
std::shared_ptr<Nz::TextureSampler> textureSampler = device->InstantiateTextureSampler({});
|
||||||
|
|
||||||
|
std::shared_ptr<Nz::ShaderBinding> skyboxShaderBinding = skyboxPipelineLayout->AllocateShaderBinding();
|
||||||
|
skyboxShaderBinding->Update({
|
||||||
|
{
|
||||||
|
0,
|
||||||
|
Nz::ShaderBinding::UniformBufferBinding {
|
||||||
|
viewerDataUBO.get(),
|
||||||
|
0, viewerDataUBO->GetSize()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
1,
|
||||||
|
Nz::ShaderBinding::TextureBinding {
|
||||||
|
skyboxTexture.get(),
|
||||||
|
textureSampler.get()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Nz::BakedFrameGraph bakedGraph = [&]
|
||||||
|
{
|
||||||
Nz::FrameGraph graph;
|
Nz::FrameGraph graph;
|
||||||
|
|
||||||
colorTexture = graph.AddAttachment({
|
colorTexture = graph.AddAttachment({
|
||||||
|
|
@ -544,7 +607,26 @@ int main()
|
||||||
lightingPass.SetClearColor(lightingPass.AddOutput(backbuffer), Nz::Color::Black);
|
lightingPass.SetClearColor(lightingPass.AddOutput(backbuffer), Nz::Color::Black);
|
||||||
lightingPass.SetDepthStencilInput(depthBuffer);
|
lightingPass.SetDepthStencilInput(depthBuffer);
|
||||||
lightingPass.SetDepthStencilOutput(depthBuffer);
|
lightingPass.SetDepthStencilOutput(depthBuffer);
|
||||||
//lightingPass.SetDepthStencilInput(depthBuffer);
|
|
||||||
|
Nz::FramePass& forwardPass = graph.AddPass("Forward pass");
|
||||||
|
forwardPass.SetCommandCallback([&](Nz::CommandBufferBuilder& builder)
|
||||||
|
{
|
||||||
|
builder.SetScissor(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) });
|
||||||
|
builder.SetViewport(Nz::Recti{ 0, 0, int(offscreenWidth), int(offscreenHeight) });
|
||||||
|
|
||||||
|
builder.BindShaderBinding(*skyboxShaderBinding);
|
||||||
|
|
||||||
|
builder.BindIndexBuffer(cubeMeshGfx->GetIndexBuffer(0).get());
|
||||||
|
builder.BindVertexBuffer(0, cubeMeshGfx->GetVertexBuffer(0).get());
|
||||||
|
builder.BindPipeline(*skyboxPipeline);
|
||||||
|
|
||||||
|
builder.DrawIndexed(static_cast<Nz::UInt32>(cubeMeshGfx->GetIndexCount(0)));
|
||||||
|
});
|
||||||
|
|
||||||
|
forwardPass.AddInput(backbuffer);
|
||||||
|
forwardPass.AddOutput(backbuffer);
|
||||||
|
forwardPass.SetDepthStencilInput(depthBuffer);
|
||||||
|
forwardPass.SetDepthStencilOutput(depthBuffer);
|
||||||
|
|
||||||
graph.SetBackbufferOutput(backbuffer);
|
graph.SetBackbufferOutput(backbuffer);
|
||||||
|
|
||||||
|
|
@ -553,8 +635,6 @@ int main()
|
||||||
|
|
||||||
bakedGraph.Resize(offscreenWidth, offscreenHeight);
|
bakedGraph.Resize(offscreenWidth, offscreenHeight);
|
||||||
|
|
||||||
std::shared_ptr<Nz::TextureSampler> textureSampler = device->InstantiateTextureSampler({});
|
|
||||||
|
|
||||||
|
|
||||||
for (std::size_t i = 0; i < MaxPointLight; ++i)
|
for (std::size_t i = 0; i < MaxPointLight; ++i)
|
||||||
{
|
{
|
||||||
|
|
@ -787,7 +867,6 @@ int main()
|
||||||
Nz::Vector3f position = Nz::Matrix4f::Rotate(Nz::EulerAnglesf(0.f, elapsedTime * 45.f * rotationSpeed, 0.f)) * spotLight.position;
|
Nz::Vector3f position = Nz::Matrix4f::Rotate(Nz::EulerAnglesf(0.f, elapsedTime * 45.f * rotationSpeed, 0.f)) * spotLight.position;
|
||||||
Nz::Vector3f direction = Nz::Matrix4f::Rotate(Nz::EulerAnglesf(0.f, elapsedTime * 90.f * rotationSpeed, 0.f)) * spotLight.direction;
|
Nz::Vector3f direction = Nz::Matrix4f::Rotate(Nz::EulerAnglesf(0.f, elapsedTime * 90.f * rotationSpeed, 0.f)) * spotLight.direction;
|
||||||
|
|
||||||
|
|
||||||
Nz::AccessByOffset<Nz::Vector3f&>(lightDataPtr, colorOffset) = Nz::Vector3f(spotLight.color.r / 255.f, spotLight.color.g / 255.f, spotLight.color.b / 255.f);
|
Nz::AccessByOffset<Nz::Vector3f&>(lightDataPtr, colorOffset) = Nz::Vector3f(spotLight.color.r / 255.f, spotLight.color.g / 255.f, spotLight.color.b / 255.f);
|
||||||
Nz::AccessByOffset<Nz::Vector3f&>(lightDataPtr, positionOffset) = position;
|
Nz::AccessByOffset<Nz::Vector3f&>(lightDataPtr, positionOffset) = position;
|
||||||
Nz::AccessByOffset<Nz::Vector3f&>(lightDataPtr, directionOffset) = direction;
|
Nz::AccessByOffset<Nz::Vector3f&>(lightDataPtr, directionOffset) = direction;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue