From 6f18a029993fa98af306599767cd9031b938ffbd Mon Sep 17 00:00:00 2001 From: SirLynix Date: Thu, 16 Jun 2022 19:26:57 +0200 Subject: [PATCH] Add fullscreen vertex shader module --- assets/shaders/bloom_bright.nzsl | 30 +------- assets/shaders/bloom_final.nzsl | 30 +------- assets/shaders/gamma.nzsl | 30 +------- assets/shaders/gaussian_blur.nzsl | 30 +------- assets/shaders/god_rays.nzsl | 30 +------- assets/shaders/tone_mapping.nzsl | 30 +------- examples/DeferredShading/main.cpp | 68 +----------------- examples/RenderTest/main.cpp | 71 ++++--------------- include/Nazara/Graphics/Graphics.hpp | 5 -- include/Nazara/Graphics/Graphics.inl | 10 --- src/Nazara/Graphics/ForwardFramePipeline.cpp | 2 - src/Nazara/Graphics/Graphics.cpp | 37 ++-------- .../Resources/Shaders/FullscreenVertex.nzsl | 33 +++++++++ .../Resources/Shaders/TextureBlit.nzsl | 24 +------ 14 files changed, 67 insertions(+), 363 deletions(-) create mode 100644 src/Nazara/Graphics/Resources/Shaders/FullscreenVertex.nzsl diff --git a/assets/shaders/bloom_bright.nzsl b/assets/shaders/bloom_bright.nzsl index e1df793a5..3143d17c9 100644 --- a/assets/shaders/bloom_bright.nzsl +++ b/assets/shaders/bloom_bright.nzsl @@ -1,6 +1,7 @@ [nzsl_version("1.0")] module; +import VertOut, VertexShader from Engine.FullscreenVertex; import ViewerData from Engine.ViewerData; external @@ -9,30 +10,13 @@ external [set(0), binding(1)] colorTexture: sampler2D[f32], } -struct FragIn -{ - [location(0)] uv: vec2[f32] -} - struct FragOut { [location(0)] color: vec4[f32] } -struct VertIn -{ - [location(0)] pos: vec2[f32], - [location(1)] uv: vec2[f32] -} - -struct VertOut -{ - [builtin(position)] position: vec4[f32], - [location(0)] uv: vec2[f32] -} - [entry(frag)] -fn main(input: FragIn) -> FragOut +fn main(input: VertOut) -> FragOut { /*let BrightLuminance = 0.8; let BrightMiddleGrey = 0.5; @@ -56,13 +40,3 @@ fn main(input: FragIn) -> FragOut return output; } - -[entry(vert)] -fn main(input: VertIn) -> VertOut -{ - let output: VertOut; - output.position = vec4[f32](input.pos, 0.0, 1.0); - output.uv = input.uv; - - return output; -} diff --git a/assets/shaders/bloom_final.nzsl b/assets/shaders/bloom_final.nzsl index b173d3e0f..57b4c23c0 100644 --- a/assets/shaders/bloom_final.nzsl +++ b/assets/shaders/bloom_final.nzsl @@ -1,6 +1,7 @@ [nzsl_version("1.0")] module; +import VertOut, VertexShader from Engine.FullscreenVertex; import ViewerData from Engine.ViewerData; external @@ -10,43 +11,16 @@ external [set(0), binding(2)] bloomTexture: sampler2D[f32], } -struct FragIn -{ - [location(0)] uv: vec2[f32] -} - struct FragOut { [location(0)] color: vec4[f32] } -struct VertIn -{ - [location(0)] pos: vec2[f32], - [location(1)] uv: vec2[f32], -} - -struct VertOut -{ - [location(0)] uv: vec2[f32], - [builtin(position)] position: vec4[f32] -} - [entry(frag)] -fn main(input: FragIn) -> FragOut +fn main(input: VertOut) -> FragOut { let output: FragOut; output.color = /*colorTexture.Sample(fragcoord) + */bloomTexture.Sample(input.uv); return output; } - -[entry(vert)] -fn main(input: VertIn) -> VertOut -{ - let output: VertOut; - output.position = vec4[f32](input.pos, 0.0, 1.0); - output.uv = input.uv; - - return output; -} diff --git a/assets/shaders/gamma.nzsl b/assets/shaders/gamma.nzsl index 24c991ce0..b220a9a23 100644 --- a/assets/shaders/gamma.nzsl +++ b/assets/shaders/gamma.nzsl @@ -1,35 +1,20 @@ [nzsl_version("1.0")] module; +import VertOut, VertexShader from Engine.FullscreenVertex; + external { [binding(0)] colorTexture: sampler2D[f32] } -struct FragIn -{ - [location(0)] uv: vec2[f32] -} - struct FragOut { [location(0)] color: vec4[f32] } -struct VertIn -{ - [location(0)] pos: vec2[f32], - [location(1)] uv: vec2[f32] -} - -struct VertOut -{ - [location(0)] vertUV: vec2[f32], - [builtin(position)] position: vec4[f32] -} - [entry(frag)] -fn main(input: FragIn) -> FragOut +fn main(input: VertOut) -> FragOut { let gamma = 2.2; @@ -38,12 +23,3 @@ fn main(input: FragIn) -> FragOut //output.color = pow(colorTexture.Sample(input.uv), vec4[f32](1.0 / gamma, 1.0 / gamma, 1.0 / gamma, 1.0)); return output; } - -[entry(vert)] -fn main(input: VertIn) -> VertOut -{ - let output: VertOut; - output.position = vec4[f32](input.pos, 0.0, 1.0); - output.vertUV = input.uv; - return output; -} diff --git a/assets/shaders/gaussian_blur.nzsl b/assets/shaders/gaussian_blur.nzsl index abffebec8..34798c651 100644 --- a/assets/shaders/gaussian_blur.nzsl +++ b/assets/shaders/gaussian_blur.nzsl @@ -1,6 +1,7 @@ [nzsl_version("1.0")] module; +import VertOut, VertexShader from Engine.FullscreenVertex; import ViewerData from Engine.ViewerData; [layout(std140)] @@ -17,30 +18,13 @@ external [set(0), binding(2)] blurData: uniform[BlurData] } -struct FragIn -{ - [location(0)] uv: vec2[f32] -} - struct FragOut { [location(0)] color: vec4[f32] } -struct VertIn -{ - [location(0)] pos: vec2[f32], - [location(1)] uv: vec2[f32], -} - -struct VertOut -{ - [location(0)] uv: vec2[f32], - [builtin(position)] position: vec4[f32] -} - [entry(frag)] -fn main(input: FragIn) -> FragOut +fn main(input: VertOut) -> FragOut { let invTargetSize = viewerData.invRenderTargetSize * blurData.sizeFactor; @@ -57,13 +41,3 @@ fn main(input: FragIn) -> FragOut return output; } - -[entry(vert)] -fn main(input: VertIn) -> VertOut -{ - let output: VertOut; - output.position = vec4[f32](input.pos, 0.0, 1.0); - output.uv = input.uv; - - return output; -} diff --git a/assets/shaders/god_rays.nzsl b/assets/shaders/god_rays.nzsl index 2a35ca273..b2db2e9aa 100644 --- a/assets/shaders/god_rays.nzsl +++ b/assets/shaders/god_rays.nzsl @@ -1,6 +1,7 @@ [nzsl_version("1.0")] module; +import VertOut, VertexShader from Engine.FullscreenVertex; import ViewerData from Engine.ViewerData; [layout(std140)] @@ -22,30 +23,13 @@ external [set(0), binding(2)] occluderTexture: sampler2D[f32] } -struct FragIn -{ - [location(0)] uv: vec2[f32] -} - struct FragOut { [location(0)] color: vec4[f32] } -struct VertIn -{ - [location(0)] pos: vec2[f32], - [location(1)] uv: vec2[f32] -} - -struct VertOut -{ - [builtin(position)] position: vec4[f32], - [location(0)] uv: vec2[f32] -} - [entry(frag)] -fn main(input: FragIn) -> FragOut +fn main(input: VertOut) -> FragOut { let deltaUV = input.uv - settings.lightPosition; deltaUV *= 1.0 / f32(SampleCount) * settings.density; @@ -71,13 +55,3 @@ fn main(input: FragIn) -> FragOut return output; } - -[entry(vert)] -fn main(input: VertIn) -> VertOut -{ - let output: VertOut; - output.position = vec4[f32](input.pos, 0.0, 1.0); - output.uv = input.uv; - - return output; -} diff --git a/assets/shaders/tone_mapping.nzsl b/assets/shaders/tone_mapping.nzsl index 2b5b83ac1..23f4b7089 100644 --- a/assets/shaders/tone_mapping.nzsl +++ b/assets/shaders/tone_mapping.nzsl @@ -1,6 +1,7 @@ [nzsl_version("1.0")] module; +import VertOut, VertexShader from Engine.FullscreenVertex; import ViewerData from Engine.ViewerData; external @@ -9,30 +10,13 @@ external [set(0), binding(1)] inputTexture: sampler2D[f32] } -struct FragIn -{ - [location(0)] uv: vec2[f32], -} - struct FragOut { [location(0)] color: vec4[f32] } -struct VertIn -{ - [location(0)] pos: vec2[f32], - [location(1)] uv: vec2[f32], -} - -struct VertOut -{ - [location(0)] uv: vec2[f32], - [builtin(position)] position: vec4[f32] -} - [entry(frag)] -fn main(input: FragIn) -> FragOut +fn main(input: VertOut) -> FragOut { let exposure = 0.8; @@ -46,13 +30,3 @@ fn main(input: FragIn) -> FragOut return output; } - -[entry(vert)] -fn main(input: VertIn) -> VertOut -{ - let output: VertOut; - output.position = vec4[f32](input.pos, 0.0, 1.0); - output.uv = input.uv; - - return output; -} diff --git a/examples/DeferredShading/main.cpp b/examples/DeferredShading/main.cpp index 5b142ea5a..8879a0edb 100644 --- a/examples/DeferredShading/main.cpp +++ b/examples/DeferredShading/main.cpp @@ -359,10 +359,6 @@ int main() light.radius = radiusDis(randomEngine); } - - const std::shared_ptr& fullscreenVertexDeclaration = Nz::VertexDeclaration::Get(Nz::VertexLayout::XY_UV); - - unsigned int offscreenWidth = windowSize.x; unsigned int offscreenHeight = windowSize.y; @@ -384,10 +380,6 @@ int main() Nz::RenderPipelineInfo fullscreenPipelineInfoViewer; fullscreenPipelineInfoViewer.primitiveMode = Nz::PrimitiveMode::TriangleList; fullscreenPipelineInfoViewer.pipelineLayout = device->InstantiateRenderPipelineLayout(fullscreenPipelineLayoutInfoViewer); - fullscreenPipelineInfoViewer.vertexBuffers.push_back({ - 0, - fullscreenVertexDeclaration - }); fullscreenPipelineInfoViewer.shaderModules.push_back(device->InstantiateShaderModule(nzsl::ShaderStageType::Fragment | nzsl::ShaderStageType::Vertex, Nz::ShaderLanguage::NazaraShader, shaderDir / "bloom_bright.nzsl", states)); @@ -477,10 +469,6 @@ int main() bloomBlendPipelineInfo.blend.srcColor = Nz::BlendFunc::One; bloomBlendPipelineInfo.primitiveMode = Nz::PrimitiveMode::TriangleList; bloomBlendPipelineInfo.pipelineLayout = device->InstantiateRenderPipelineLayout(bloomBlendPipelineLayoutInfo); - bloomBlendPipelineInfo.vertexBuffers.push_back({ - 0, - fullscreenVertexDeclaration - }); bloomBlendPipelineInfo.shaderModules.push_back(device->InstantiateShaderModule(nzsl::ShaderStageType::Fragment | nzsl::ShaderStageType::Vertex, Nz::ShaderLanguage::NazaraShader, shaderDir / "bloom_final.nzsl", states)); @@ -501,10 +489,6 @@ int main() Nz::RenderPipelineInfo fullscreenPipelineInfo; fullscreenPipelineInfo.primitiveMode = Nz::PrimitiveMode::TriangleList; fullscreenPipelineInfo.pipelineLayout = device->InstantiateRenderPipelineLayout(fullscreenPipelineLayoutInfo); - fullscreenPipelineInfo.vertexBuffers.push_back({ - 0, - fullscreenVertexDeclaration - }); fullscreenPipelineInfo.shaderModules.push_back(device->InstantiateShaderModule(nzsl::ShaderStageType::Fragment | nzsl::ShaderStageType::Vertex, Nz::ShaderLanguage::NazaraShader, shaderDir / "gamma.nzsl", states)); @@ -535,10 +519,6 @@ int main() Nz::RenderPipelineInfo godraysPipelineInfo; godraysPipelineInfo.primitiveMode = Nz::PrimitiveMode::TriangleList; godraysPipelineInfo.pipelineLayout = device->InstantiateRenderPipelineLayout(godraysPipelineLayoutInfo); - godraysPipelineInfo.vertexBuffers.push_back({ - 0, - fullscreenVertexDeclaration - }); godraysPipelineInfo.shaderModules.push_back(device->InstantiateShaderModule(nzsl::ShaderStageType::Fragment | nzsl::ShaderStageType::Vertex, Nz::ShaderLanguage::NazaraShader, shaderDir / "god_rays.nzsl", states)); @@ -622,46 +602,6 @@ int main() std::vector> lightingShaderBindings; - std::array vertexData = { - { - { - Nz::Vector2f(-1.f, 1.f), - Nz::Vector2f(0.0f, 1.0f), - }, - { - Nz::Vector2f(-1.f, -3.f), - Nz::Vector2f(0.0f, -1.0f), - }, - { - Nz::Vector2f(3.f, 1.f), - Nz::Vector2f(2.0f, 1.0f), - } - } - }; - - /*std::array vertexData = { - { - { - Nz::Vector3f(-1.f, -1.f, 0.0f), - Nz::Vector2f(0.0f, 0.0f), - }, - { - Nz::Vector3f(1.f, -1.f, 0.0f), - Nz::Vector2f(1.0f, 0.0f), - }, - { - Nz::Vector3f(-1.f, 1.f, 0.0f), - Nz::Vector2f(0.0f, 1.0f), - }, - { - Nz::Vector3f(1.f, 1.f, 0.0f), - Nz::Vector2f(1.0f, 1.0f), - }, - } - };*/ - - std::shared_ptr fullscreenVertexBuffer = device->InstantiateBuffer(Nz::BufferType::Vertex, fullscreenVertexDeclaration->GetStride() * vertexData.size(), Nz::BufferUsage::DeviceLocal | Nz::BufferUsage::Write, vertexData.data()); - std::shared_ptr bloomSkipBlit; std::shared_ptr finalBlitBinding; @@ -973,7 +913,6 @@ int main() builder.BindShaderBinding(0, *godRaysShaderBinding); builder.BindPipeline(*godraysPipeline); - builder.BindVertexBuffer(0, *fullscreenVertexBuffer); builder.Draw(3); }); @@ -990,7 +929,6 @@ int main() builder.BindShaderBinding(0, *bloomBrightShaderBinding); builder.BindPipeline(*bloomBrightPipeline); - builder.BindVertexBuffer(0, *fullscreenVertexBuffer); builder.Draw(3); }); @@ -1013,7 +951,6 @@ int main() builder.BindShaderBinding(0, *gaussianBlurShaderBinding[i * 2 + 0]); builder.BindPipeline(*gaussianBlurPipeline); - builder.BindVertexBuffer(0, *fullscreenVertexBuffer); builder.Draw(3); }); @@ -1034,7 +971,6 @@ int main() builder.BindShaderBinding(0, *gaussianBlurShaderBinding[i * 2 + 1]); builder.BindPipeline(*gaussianBlurPipeline); - builder.BindVertexBuffer(0, *fullscreenVertexBuffer); builder.Draw(3); }); @@ -1053,7 +989,6 @@ int main() { builder.SetScissor(env.renderRect); builder.SetViewport(env.renderRect); - builder.BindVertexBuffer(0, *fullscreenVertexBuffer); // Blend bloom builder.BindPipeline(*bloomBlendPipeline); @@ -1092,7 +1027,6 @@ int main() builder.BindShaderBinding(0, *toneMappingShaderBinding); builder.BindPipeline(*toneMappingPipeline); - builder.BindVertexBuffer(0, *fullscreenVertexBuffer); builder.Draw(3); }); @@ -1592,7 +1526,7 @@ int main() builder.BindShaderBinding(0, *finalBlitBinding); builder.BindPipeline(*fullscreenPipeline); - builder.BindVertexBuffer(0, *fullscreenVertexBuffer); + builder.Draw(3); } builder.EndDebugRegion(); diff --git a/examples/RenderTest/main.cpp b/examples/RenderTest/main.cpp index ef50fc282..5ccde48d0 100644 --- a/examples/RenderTest/main.cpp +++ b/examples/RenderTest/main.cpp @@ -12,51 +12,24 @@ NAZARA_REQUEST_DEDICATED_GPU() -const char barModuleSource[] = R"( +const char shaderSource[] = R"( [nzsl_version("1.0")] -module Test.Bar; +module; -fn dummy() {} +option red: bool = false; -[export] -[layout(std140)] -struct Bar -{ -} -)"; - -const char dataModuleSource[] = R"( -[nzsl_version("1.0")] -module Test.Data; - -import Test.Bar; - -struct Foo {} - -[export] [layout(std140)] struct Data { projectionMatrix: mat4[f32], worldMatrix: mat4[f32], - viewMatrix: mat4[f32], - pilier: Bar + viewMatrix: mat4[f32] } -)"; - -const char shaderSource[] = R"( -[nzsl_version("1.0")] -module; - -import Test.Data; -import Test.Bar; - -option red: bool = false; [set(0)] external { - [binding(0)] viewerData: uniform[Data] + [binding(0)] data: uniform[Data] } [set(1)] @@ -100,7 +73,7 @@ fn main(fragIn: VertOut) -> FragOut fn main(vertIn: VertIn) -> VertOut { let vertOut: VertOut; - vertOut.position = viewerData.projectionMatrix * viewerData.viewMatrix * viewerData.worldMatrix * vec4[f32](vertIn.position, 1.0); + vertOut.position = data.projectionMatrix * data.viewMatrix * data.worldMatrix * vec4[f32](vertIn.position, 1.0); vertOut.normal = vertIn.normal; vertOut.uv = vertIn.uv; @@ -110,9 +83,9 @@ fn main(vertIn: VertIn) -> VertOut int main() { - std::filesystem::path resourceDir = "resources"; - if (!std::filesystem::is_directory(resourceDir) && std::filesystem::is_directory(".." / resourceDir)) - resourceDir = ".." / resourceDir; + std::filesystem::path resourceDir = "assets/examples"; + if (!std::filesystem::is_directory(resourceDir) && std::filesystem::is_directory("../.." / resourceDir)) + resourceDir = "../.." / resourceDir; Nz::Renderer::Config rendererConfig; std::cout << "Run using Vulkan? (y/n)" << std::endl; @@ -141,26 +114,8 @@ int main() return __LINE__; } - auto directoryModuleResolver = std::make_shared(); - directoryModuleResolver->RegisterModule(std::string_view(barModuleSource)); - directoryModuleResolver->RegisterModule(std::string_view(dataModuleSource)); - - nzsl::Ast::SanitizeVisitor::Options sanitizeOpt; - sanitizeOpt.moduleResolver = directoryModuleResolver; - - shaderModule = nzsl::Ast::Sanitize(*shaderModule, sanitizeOpt); - if (!shaderModule) - { - std::cout << "Failed to compile shader module" << std::endl; - return __LINE__; - } - - nzsl::LangWriter langWriter; - std::string output = langWriter.Generate(*shaderModule); - std::cout << output << std::endl; - assert(nzsl::Ast::Sanitize(*nzsl::Parse(output))); - nzsl::ShaderWriter::States states; + states.optionValues[Nz::CRC32("red")] = false; //< Try enabling this! states.optimize = true; auto fragVertShader = device->InstantiateShaderModule(nzsl::ShaderStageType::Fragment | nzsl::ShaderStageType::Vertex, *shaderModule, states); @@ -176,14 +131,14 @@ int main() meshParams.matrix = Nz::Matrix4f::Rotate(Nz::EulerAnglesf(0.f, -90.f, 0.f)) * Nz::Matrix4f::Scale(Nz::Vector3f(0.002f)); meshParams.vertexDeclaration = Nz::VertexDeclaration::Get(Nz::VertexLayout::XYZ_Normal_UV); - std::shared_ptr drfreak = Nz::Mesh::LoadFromFile(resourceDir / "Spaceship/spaceship.obj", meshParams); - if (!drfreak) + std::shared_ptr spaceship = Nz::Mesh::LoadFromFile(resourceDir / "Spaceship/spaceship.obj", meshParams); + if (!spaceship) { NazaraError("Failed to load model"); return __LINE__; } - std::shared_ptr spaceshipMesh = std::static_pointer_cast(drfreak->GetSubMesh(0)); + std::shared_ptr spaceshipMesh = std::static_pointer_cast(spaceship->GetSubMesh(0)); const std::shared_ptr& meshVB = spaceshipMesh->GetVertexBuffer(); const std::shared_ptr& meshIB = spaceshipMesh->GetIndexBuffer(); diff --git a/include/Nazara/Graphics/Graphics.hpp b/include/Nazara/Graphics/Graphics.hpp index 3a4eac097..831a534ef 100644 --- a/include/Nazara/Graphics/Graphics.hpp +++ b/include/Nazara/Graphics/Graphics.hpp @@ -38,8 +38,6 @@ namespace Nz inline const std::shared_ptr& GetBlitPipeline(bool transparent) const; inline const std::shared_ptr& GetBlitPipelineLayout() const; inline const DefaultTextures& GetDefaultTextures() const; - inline const std::shared_ptr& GetFullscreenVertexBuffer() const; - inline const std::shared_ptr& GetFullscreenVertexDeclaration() const; inline MaterialPassRegistry& GetMaterialPassRegistry(); inline const MaterialPassRegistry& GetMaterialPassRegistry() const; inline PixelFormat GetPreferredDepthStencilFormat() const; @@ -62,7 +60,6 @@ namespace Nz private: void BuildBlitPipeline(); void BuildDefaultTextures(); - void BuildFullscreenVertexBuffer(); void RegisterMaterialPasses(); void RegisterShaderModules(); template void RegisterEmbedShaderModule(const UInt8(&content)[N]); @@ -71,12 +68,10 @@ namespace Nz std::optional m_renderPassCache; std::optional m_samplerCache; std::shared_ptr m_shaderModuleResolver; - std::shared_ptr m_fullscreenVertexBuffer; std::shared_ptr m_renderDevice; std::shared_ptr m_blitPipeline; std::shared_ptr m_blitPipelineTransparent; std::shared_ptr m_blitPipelineLayout; - std::shared_ptr m_fullscreenVertexDeclaration; DefaultTextures m_defaultTextures; MaterialPassRegistry m_materialPassRegistry; PixelFormat m_preferredDepthStencilFormat; diff --git a/include/Nazara/Graphics/Graphics.inl b/include/Nazara/Graphics/Graphics.inl index 2241d19c4..93db349e5 100644 --- a/include/Nazara/Graphics/Graphics.inl +++ b/include/Nazara/Graphics/Graphics.inl @@ -22,16 +22,6 @@ namespace Nz return m_defaultTextures; } - inline const std::shared_ptr& Graphics::GetFullscreenVertexBuffer() const - { - return m_fullscreenVertexBuffer; - } - - inline const std::shared_ptr& Graphics::GetFullscreenVertexDeclaration() const - { - return m_fullscreenVertexDeclaration; - } - inline MaterialPassRegistry& Graphics::GetMaterialPassRegistry() { return m_materialPassRegistry; diff --git a/src/Nazara/Graphics/ForwardFramePipeline.cpp b/src/Nazara/Graphics/ForwardFramePipeline.cpp index 9e8a113a4..6bbb32956 100644 --- a/src/Nazara/Graphics/ForwardFramePipeline.cpp +++ b/src/Nazara/Graphics/ForwardFramePipeline.cpp @@ -366,7 +366,6 @@ namespace Nz builder.SetScissor(renderRegion); builder.SetViewport(renderRegion); builder.BindPipeline(*graphics->GetBlitPipeline(false)); - builder.BindVertexBuffer(0, *graphics->GetFullscreenVertexBuffer()); builder.BindShaderBinding(0, *data.blitShaderBinding); builder.Draw(3); @@ -539,7 +538,6 @@ namespace Nz Graphics* graphics = Graphics::Instance(); builder.BindPipeline(*graphics->GetBlitPipeline(false)); - builder.BindVertexBuffer(0, *graphics->GetFullscreenVertexBuffer()); bool first = true; diff --git a/src/Nazara/Graphics/Graphics.cpp b/src/Nazara/Graphics/Graphics.cpp index 8b05adec4..658b1333a 100644 --- a/src/Nazara/Graphics/Graphics.cpp +++ b/src/Nazara/Graphics/Graphics.cpp @@ -29,6 +29,10 @@ namespace Nz #include }; + const UInt8 r_fullscreenVertexShader[] = { + #include + }; + const UInt8 r_phongMaterialShader[] = { #include }; @@ -90,7 +94,6 @@ namespace Nz m_samplerCache.emplace(m_renderDevice); BuildDefaultTextures(); - BuildFullscreenVertexBuffer(); RegisterShaderModules(); BuildBlitPipeline(); RegisterMaterialPasses(); @@ -131,8 +134,6 @@ namespace Nz MaterialPipeline::Uninitialize(); m_renderPassCache.reset(); m_samplerCache.reset(); - m_fullscreenVertexBuffer.reset(); - m_fullscreenVertexDeclaration.reset(); m_blitPipeline.reset(); m_blitPipelineLayout.reset(); m_defaultTextures.whiteTextures.fill(nullptr); @@ -166,12 +167,6 @@ namespace Nz pipelineInfo.pipelineLayout = m_blitPipelineLayout; pipelineInfo.shaderModules.push_back(std::move(blitShader)); - pipelineInfo.vertexBuffers.assign({ - { - 0, - m_fullscreenVertexDeclaration - } - }); m_blitPipeline = m_renderDevice->InstantiateRenderPipeline(pipelineInfo); @@ -207,29 +202,6 @@ namespace Nz } } - void Graphics::BuildFullscreenVertexBuffer() - { - m_fullscreenVertexDeclaration = VertexDeclaration::Get(VertexLayout::XY_UV); - std::array vertexData = { - { - { - Nz::Vector2f(-1.f, 1.f), - Nz::Vector2f(0.0f, 1.0f), - }, - { - Nz::Vector2f(-1.f, -3.f), - Nz::Vector2f(0.0f, -1.0f), - }, - { - Nz::Vector2f(3.f, 1.f), - Nz::Vector2f(2.0f, 1.0f), - } - } - }; - - m_fullscreenVertexBuffer = m_renderDevice->InstantiateBuffer(BufferType::Vertex, m_fullscreenVertexDeclaration->GetStride() * vertexData.size(), BufferUsage::DeviceLocal | BufferUsage::Write, vertexData.data()); - } - void Graphics::RegisterMaterialPasses() { m_materialPassRegistry.RegisterPass("ForwardPass"); @@ -241,6 +213,7 @@ namespace Nz m_shaderModuleResolver = std::make_shared(); RegisterEmbedShaderModule(r_basicMaterialShader); RegisterEmbedShaderModule(r_depthMaterialShader); + RegisterEmbedShaderModule(r_fullscreenVertexShader); RegisterEmbedShaderModule(r_phongMaterialShader); RegisterEmbedShaderModule(r_textureBlitShader); RegisterEmbedShaderModule(r_instanceDataModule); diff --git a/src/Nazara/Graphics/Resources/Shaders/FullscreenVertex.nzsl b/src/Nazara/Graphics/Resources/Shaders/FullscreenVertex.nzsl new file mode 100644 index 000000000..12d57467a --- /dev/null +++ b/src/Nazara/Graphics/Resources/Shaders/FullscreenVertex.nzsl @@ -0,0 +1,33 @@ +[nzsl_version("1.0")] +module Engine.FullscreenVertex; + +[export] +struct VertIn +{ + [builtin(vertex_index)] vert_index: i32 +} + +[export] +struct VertOut +{ + [builtin(position)] position: vec4[f32], + [location(0)] uv: vec2[f32] +} + +const vertPos = array[vec2[f32]]( + vec2[f32](-1.0, 1.0), + vec2[f32](-1.0, -3.0), + vec2[f32]( 3.0, 1.0) +); + +[export, entry(vert)] +fn VertexShader(input: VertIn) -> VertOut +{ + let position = vertPos[input.vert_index]; + + let output: VertOut; + output.position = vec4[f32](position, 0.0, 1.0); + output.uv = position * 0.5 + vec2[f32](0.5, 0.5); + + return output; +} diff --git a/src/Nazara/Graphics/Resources/Shaders/TextureBlit.nzsl b/src/Nazara/Graphics/Resources/Shaders/TextureBlit.nzsl index e7d4077ce..862e002ad 100644 --- a/src/Nazara/Graphics/Resources/Shaders/TextureBlit.nzsl +++ b/src/Nazara/Graphics/Resources/Shaders/TextureBlit.nzsl @@ -1,33 +1,13 @@ [nzsl_version("1.0")] module TextureBlit; +import VertOut, VertexShader from Engine.FullscreenVertex; + external { [binding(0)] texture: sampler2D[f32] } -struct VertIn -{ - [location(0)] position: vec2[f32], - [location(1)] uv: vec2[f32] -} - -struct VertOut -{ - [builtin(position)] position: vec4[f32], - [location(0)] uv: vec2[f32] -} - -[entry(vert)] -fn main(vertIn: VertIn) -> VertOut -{ - let output: VertOut; - output.position = vec4[f32](vertIn.position, 0.0, 1.0); - output.uv = vertIn.uv; - - return output; -} - struct FragOut { [location(0)] color: vec4[f32]