Graphics: Use module name to retrieve material shaders
This commit is contained in:
parent
0f55779a8a
commit
0e92ef823d
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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) };
|
||||||
|
|
|
||||||
|
|
@ -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) };
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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) };
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
[nzsl_version("1.0")]
|
[nzsl_version("1.0")]
|
||||||
module;
|
module Blit;
|
||||||
|
|
||||||
external
|
external
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue