Graphics: Use module name to retrieve material shaders

This commit is contained in:
Jérôme Leclercq 2022-03-15 13:14:43 +01:00
parent 0f55779a8a
commit 0e92ef823d
9 changed files with 42 additions and 95 deletions

View File

@ -65,6 +65,7 @@ namespace Nz
void BuildFullscreenVertexBuffer(); void BuildFullscreenVertexBuffer();
void RegisterMaterialPasses(); void RegisterMaterialPasses();
void RegisterShaderModules(); void RegisterShaderModules();
template<std::size_t N> void RegisterEmbedShaderModule(const UInt8(&content)[N]);
void SelectDepthStencilFormats(); void SelectDepthStencilFormats();
std::optional<RenderPassCache> m_renderPassCache; std::optional<RenderPassCache> m_renderPassCache;

View File

@ -17,13 +17,6 @@
namespace Nz namespace Nz
{ {
namespace
{
const UInt8 r_basicMaterialShader[] = {
#include <Nazara/Graphics/Resources/Shaders/basic_material.nzsl.h>
};
}
BasicMaterial::BasicMaterial(MaterialPass& material) : BasicMaterial::BasicMaterial(MaterialPass& material) :
BasicMaterial(material, NoInit{}) BasicMaterial(material, NoInit{})
{ {
@ -236,26 +229,7 @@ namespace Nz
std::vector<std::shared_ptr<UberShader>> BasicMaterial::BuildShaders() std::vector<std::shared_ptr<UberShader>> BasicMaterial::BuildShaders()
{ {
ShaderAst::ModulePtr shaderModule; ShaderAst::ModulePtr shaderModule = Graphics::Instance()->GetShaderModuleResolver()->Resolve("BasicMaterial");
#ifdef NAZARA_DEBUG
std::filesystem::path shaderPath = "../../src/Nazara/Graphics/Resources/Shaders/basic_material.nzsl";
if (std::filesystem::exists(shaderPath))
{
try
{
shaderModule = ShaderLang::ParseFromFile(shaderPath);
}
catch (const std::exception& e)
{
NazaraError(std::string("failed to load shader from engine folder: ") + e.what());
}
}
#endif
if (!shaderModule)
shaderModule = ShaderLang::Parse(std::string_view(reinterpret_cast<const char*>(r_basicMaterialShader), sizeof(r_basicMaterialShader)));
auto shader = std::make_shared<UberShader>(ShaderStageType::Fragment | ShaderStageType::Vertex, std::move(shaderModule)); auto shader = std::make_shared<UberShader>(ShaderStageType::Fragment | ShaderStageType::Vertex, std::move(shaderModule));
return { std::move(shader) }; return { std::move(shader) };

View File

@ -9,35 +9,9 @@
namespace Nz namespace Nz
{ {
namespace
{
const UInt8 r_depthMaterialShader[] = {
#include <Nazara/Graphics/Resources/Shaders/depth_material.nzsl.h>
};
}
std::vector<std::shared_ptr<UberShader>> DepthMaterial::BuildShaders() std::vector<std::shared_ptr<UberShader>> DepthMaterial::BuildShaders()
{ {
ShaderAst::ModulePtr shaderModule; ShaderAst::ModulePtr shaderModule = Graphics::Instance()->GetShaderModuleResolver()->Resolve("DepthMaterial");
#ifdef NAZARA_DEBUG
std::filesystem::path shaderPath = "../../src/Nazara/Graphics/Resources/Shaders/depth_material.nzsl";
if (std::filesystem::exists(shaderPath))
{
try
{
shaderModule = ShaderLang::ParseFromFile(shaderPath);
}
catch (const std::exception& e)
{
NazaraError(std::string("failed to load shader from engine folder: ") + e.what());
}
}
#endif
if (!shaderModule)
shaderModule = ShaderLang::Parse(std::string_view(reinterpret_cast<const char*>(r_depthMaterialShader), sizeof(r_depthMaterialShader)));
auto shader = std::make_shared<UberShader>(ShaderStageType::Fragment | ShaderStageType::Vertex, std::move(shaderModule)); auto shader = std::make_shared<UberShader>(ShaderStageType::Fragment | ShaderStageType::Vertex, std::move(shaderModule));
return { std::move(shader) }; return { std::move(shader) };

View File

@ -7,6 +7,7 @@
#include <Nazara/Graphics/MaterialPipeline.hpp> #include <Nazara/Graphics/MaterialPipeline.hpp>
#include <Nazara/Graphics/PredefinedShaderStructs.hpp> #include <Nazara/Graphics/PredefinedShaderStructs.hpp>
#include <Nazara/Utility/Font.hpp> #include <Nazara/Utility/Font.hpp>
#include <array>
#include <stdexcept> #include <stdexcept>
#include <Nazara/Graphics/Debug.hpp> #include <Nazara/Graphics/Debug.hpp>
@ -15,7 +16,19 @@ namespace Nz
namespace namespace
{ {
const UInt8 r_blitShader[] = { const UInt8 r_blitShader[] = {
#include <Nazara/Graphics/Resources/Shaders/blit.nzsl.h> #include <Nazara/Graphics/Resources/Shaders/Blit.nzsl.h>
};
const UInt8 r_basicMaterialShader[] = {
#include <Nazara/Graphics/Resources/Shaders/BasicMaterial.nzsl.h>
};
const UInt8 r_depthMaterialShader[] = {
#include <Nazara/Graphics/Resources/Shaders/DepthMaterial.nzsl.h>
};
const UInt8 r_phongMaterialShader[] = {
#include <Nazara/Graphics/Resources/Shaders/PhongMaterial.nzsl.h>
}; };
const UInt8 r_instanceDataModule[] = { const UInt8 r_instanceDataModule[] = {
@ -74,8 +87,6 @@ namespace Nz
m_renderPassCache.emplace(*m_renderDevice); m_renderPassCache.emplace(*m_renderDevice);
m_samplerCache.emplace(m_renderDevice); m_samplerCache.emplace(m_renderDevice);
MaterialPipeline::Initialize();
BuildDefaultTextures(); BuildDefaultTextures();
BuildFullscreenVertexBuffer(); BuildFullscreenVertexBuffer();
RegisterShaderModules(); RegisterShaderModules();
@ -83,6 +94,8 @@ namespace Nz
RegisterMaterialPasses(); RegisterMaterialPasses();
SelectDepthStencilFormats(); SelectDepthStencilFormats();
MaterialPipeline::Initialize();
Font::SetDefaultAtlas(std::make_shared<GuillotineTextureAtlas>(*m_renderDevice)); Font::SetDefaultAtlas(std::make_shared<GuillotineTextureAtlas>(*m_renderDevice));
} }
@ -222,18 +235,29 @@ namespace Nz
void Graphics::RegisterShaderModules() void Graphics::RegisterShaderModules()
{ {
m_shaderModuleResolver = std::make_shared<FilesystemModuleResolver>(); m_shaderModuleResolver = std::make_shared<FilesystemModuleResolver>();
m_shaderModuleResolver->RegisterModule(std::string_view(reinterpret_cast<const char*>(r_instanceDataModule), sizeof(r_instanceDataModule))); RegisterEmbedShaderModule(r_basicMaterialShader);
m_shaderModuleResolver->RegisterModule(std::string_view(reinterpret_cast<const char*>(r_lightDataModule), sizeof(r_lightDataModule))); RegisterEmbedShaderModule(r_depthMaterialShader);
m_shaderModuleResolver->RegisterModule(std::string_view(reinterpret_cast<const char*>(r_viewerDataModule), sizeof(r_viewerDataModule))); RegisterEmbedShaderModule(r_phongMaterialShader);
RegisterEmbedShaderModule(r_blitShader);
if (std::filesystem::path shaderPath = "Shaders/Modules"; std::filesystem::is_directory(shaderPath)) RegisterEmbedShaderModule(r_instanceDataModule);
m_shaderModuleResolver->RegisterModuleDirectory(shaderPath); RegisterEmbedShaderModule(r_lightDataModule);
RegisterEmbedShaderModule(r_viewerDataModule);
#ifdef NAZARA_DEBUG #ifdef NAZARA_DEBUG
// Override embed files with dev files in debug // Override embed files with dev files in debug
if (std::filesystem::path modulePath = "../../src/Nazara/Graphics/Resources/Shaders/Modules"; std::filesystem::is_directory(modulePath)) if (std::filesystem::path modulePath = "../../src/Nazara/Graphics/Resources/Shaders"; std::filesystem::is_directory(modulePath))
m_shaderModuleResolver->RegisterModuleDirectory(modulePath); m_shaderModuleResolver->RegisterModuleDirectory(modulePath);
#endif #endif
// Let application register their own shaders
if (std::filesystem::path shaderPath = "Shaders"; std::filesystem::is_directory(shaderPath))
m_shaderModuleResolver->RegisterModuleDirectory(shaderPath);
}
template<std::size_t N>
void Graphics::RegisterEmbedShaderModule(const UInt8(&content)[N])
{
m_shaderModuleResolver->RegisterModule(std::string_view(reinterpret_cast<const char*>(content), N));
} }
void Graphics::SelectDepthStencilFormats() void Graphics::SelectDepthStencilFormats()

View File

@ -17,13 +17,6 @@
namespace Nz namespace Nz
{ {
namespace
{
const UInt8 r_phongMaterialShader[] = {
#include <Nazara/Graphics/Resources/Shaders/phong_material.nzsl.h>
};
}
PhongLightingMaterial::PhongLightingMaterial(MaterialPass& material) : PhongLightingMaterial::PhongLightingMaterial(MaterialPass& material) :
BasicMaterial(material, NoInit{}) BasicMaterial(material, NoInit{})
{ {
@ -317,26 +310,7 @@ namespace Nz
std::vector<std::shared_ptr<UberShader>> PhongLightingMaterial::BuildShaders() std::vector<std::shared_ptr<UberShader>> PhongLightingMaterial::BuildShaders()
{ {
ShaderAst::ModulePtr shaderModule; ShaderAst::ModulePtr shaderModule = Graphics::Instance()->GetShaderModuleResolver()->Resolve("PhongMaterial");
#ifdef NAZARA_DEBUG
std::filesystem::path shaderPath = "../../src/Nazara/Graphics/Resources/Shaders/phong_material.nzsl";
if (std::filesystem::exists(shaderPath))
{
try
{
shaderModule = ShaderLang::ParseFromFile(shaderPath);
}
catch (const std::exception& e)
{
NazaraError(std::string("failed to load shader from engine folder: ") + e.what());
}
}
#endif
if (!shaderModule)
shaderModule = ShaderLang::Parse(std::string_view(reinterpret_cast<const char*>(r_phongMaterialShader), sizeof(r_phongMaterialShader)));
auto shader = std::make_shared<UberShader>(ShaderStageType::Fragment | ShaderStageType::Vertex, std::move(shaderModule)); auto shader = std::make_shared<UberShader>(ShaderStageType::Fragment | ShaderStageType::Vertex, std::move(shaderModule));
return { std::move(shader) }; return { std::move(shader) };

View File

@ -1,5 +1,5 @@
[nzsl_version("1.0")] [nzsl_version("1.0")]
module; module BasicMaterial;
import Engine.InstanceData; import Engine.InstanceData;
import Engine.ViewerData; import Engine.ViewerData;

View File

@ -1,5 +1,5 @@
[nzsl_version("1.0")] [nzsl_version("1.0")]
module; module DepthMaterial;
import Engine.InstanceData; import Engine.InstanceData;
import Engine.ViewerData; import Engine.ViewerData;

View File

@ -1,5 +1,5 @@
[nzsl_version("1.0")] [nzsl_version("1.0")]
module; module PhongMaterial;
import Engine.InstanceData; import Engine.InstanceData;
import Engine.LightData; import Engine.LightData;

View File

@ -1,5 +1,5 @@
[nzsl_version("1.0")] [nzsl_version("1.0")]
module; module Blit;
external external
{ {