Renderer: Replace shaders files by runtime-generated GLSL

This commit is contained in:
Lynix
2017-01-06 16:21:38 +01:00
parent 8fd152aec0
commit bd8a3ba47d
6 changed files with 73 additions and 60 deletions

View File

@@ -13,11 +13,13 @@
#include <Nazara/Renderer/Config.hpp>
#include <Nazara/Renderer/Context.hpp>
#include <Nazara/Renderer/DebugDrawer.hpp>
#include <Nazara/Renderer/GlslWriter.hpp>
#include <Nazara/Renderer/HardwareBuffer.hpp>
#include <Nazara/Renderer/OpenGL.hpp>
#include <Nazara/Renderer/RenderBuffer.hpp>
#include <Nazara/Renderer/RenderTarget.hpp>
#include <Nazara/Renderer/Shader.hpp>
#include <Nazara/Renderer/ShaderBuilder.hpp>
#include <Nazara/Renderer/Texture.hpp>
#include <Nazara/Renderer/UberShader.hpp>
#include <Nazara/Utility/AbstractBuffer.hpp>
@@ -41,14 +43,6 @@ namespace Nz
{
namespace
{
const UInt8 r_coreFragmentShader[] = {
#include <Nazara/Renderer/Resources/Shaders/Debug/core.frag.h>
};
const UInt8 r_coreVertexShader[] = {
#include <Nazara/Renderer/Resources/Shaders/Debug/core.vert.h>
};
enum ObjectType
{
ObjectType_Context,
@@ -720,34 +714,12 @@ namespace Nz
return false;
}
// Création du shader de Debug
ShaderRef debugShader = Shader::New();
if (!debugShader->Create())
if (!GenerateDebugShader())
{
NazaraError("Failed to create debug shader");
NazaraError("Failed to generate debug shader");
return false;
}
if (!debugShader->AttachStageFromSource(ShaderStageType_Fragment, reinterpret_cast<const char*>(r_coreFragmentShader), sizeof(r_coreFragmentShader)))
{
NazaraError("Failed to attach fragment stage");
return false;
}
if (!debugShader->AttachStageFromSource(ShaderStageType_Vertex, reinterpret_cast<const char*>(r_coreVertexShader), sizeof(r_coreVertexShader)))
{
NazaraError("Failed to attach vertex stage");
return false;
}
if (!debugShader->Link())
{
NazaraError("Failed to link shader");
return false;
}
ShaderLibrary::Register("DebugSimple", debugShader);
onExit.Reset();
NazaraNotice("Initialized: Renderer module");
@@ -1870,6 +1842,74 @@ namespace Nz
return true;
}
bool Renderer::GenerateDebugShader()
{
Nz::GlslWriter writer;
writer.SetGlslVersion(140);
Nz::String fragmentShader;
Nz::String vertexShader;
try
{
using namespace ShaderBuilder;
using ShaderAst::BuiltinEntry;
using ShaderAst::ExpressionType;
// Fragment shader
{
auto rt0 = Output("RenderTarget0", ExpressionType::Float4);
auto color = Uniform("Color", ExpressionType::Float4);
fragmentShader = writer.Generate(ExprStatement(Assign(rt0, color)));
}
// Vertex shader
{
auto vertexPosition = Input("VertexPosition", ExpressionType::Float3);
auto wvpMatrix = Uniform("WorldViewProjMatrix", ExpressionType::Mat4x4);
auto builtinPos = Builtin(BuiltinEntry::VertexPosition);
vertexShader = writer.Generate(ExprStatement(Assign(builtinPos, Multiply(wvpMatrix, Cast<ExpressionType::Float4>(vertexPosition, Constant(1.f))))));
}
}
catch (const std::exception& e)
{
NazaraError("Failed to generate shader code: " + String(e.what()));
return false;
}
ShaderRef debugShader = Shader::New();
if (!debugShader->Create())
{
NazaraError("Failed to create debug shader");
return false;
}
if (!debugShader->AttachStageFromSource(ShaderStageType_Fragment, fragmentShader))
{
NazaraError("Failed to attach fragment stage");
return false;
}
if (!debugShader->AttachStageFromSource(ShaderStageType_Vertex, vertexShader))
{
NazaraError("Failed to attach vertex stage");
return false;
}
if (!debugShader->Link())
{
NazaraError("Failed to link shader");
return false;
}
ShaderLibrary::Register("DebugSimple", debugShader);
return true;
}
void Renderer::OnContextRelease(const Context* context)
{
s_vaos.erase(context);