#pragma once #include "Gal.hpp" struct GlobalShaderParameters { glm::mat4 projView; }; std::shared_ptr LoadVertexShader(std::string_view assetPath); std::shared_ptr LoadPixelShader(std::string_view assetPath); class PostProcess { std::shared_ptr framebuffer; std::shared_ptr fbBuffer; std::shared_ptr pipeline; std::shared_ptr pipelineInstance; std::shared_ptr result; public: PostProcess( std::shared_ptr pixelShader, std::vector>> inputTextures, std::vector> inputParameters, size_t width, size_t height, Gal::Format format, Gal::Filtering filtering); void Clear() { framebuffer->Clear(); } void Render() { pipeline->Activate(); pipelineInstance->Activate(); pipelineInstance->Render(0, 6); } template void SetShaderParameter(std::string_view name, T value) { pipeline->SetShaderParameter(name, value); } std::shared_ptr GetResultTexture() { return result; } }; class Gbuffer { std::unique_ptr lightingPass; std::shared_ptr color; //RGB - color std::shared_ptr normal; //RGB - normal std::shared_ptr addColor; //RGB - addColor std::shared_ptr light; //R - faceLight, G - skyLight, B - unused std::shared_ptr depthStencil; std::shared_ptr geomFramebuffer; public: Gbuffer(size_t geomW, size_t geomH, size_t lightW, size_t lightH); std::shared_ptr GetGeometryTarget() { return geomFramebuffer; } std::shared_ptr GetFinalTexture() { return lightingPass->GetResultTexture(); } void Render() { lightingPass->Render(); } void Clear() { geomFramebuffer->Clear(); lightingPass->Clear(); } void SetDayTime(float dayTime) { lightingPass->SetShaderParameter("dayTime", dayTime); } int GetMaxRenderBuffers() { return 5; } void SetRenderBuff(int renderBuff) { lightingPass->SetShaderParameter("renderBuff", renderBuff); } };