//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************// #pragma once #include "BsRenderBeastPrerequisites.h" #include "BsModule.h" #include "BsRendererMaterial.h" #include "BsLightRendering.h" namespace bs { namespace ct { class RendererLight; BS_PARAM_BLOCK_BEGIN(PerLightParamDef) BS_PARAM_BLOCK_ENTRY(Vector4, gLightPositionAndSrcRadius) BS_PARAM_BLOCK_ENTRY(Vector4, gLightColorAndLuminance) BS_PARAM_BLOCK_ENTRY(Vector4, gLightSpotAnglesAndSqrdInvAttRadius) BS_PARAM_BLOCK_ENTRY(Vector4, gLightDirectionAndAttRadius) BS_PARAM_BLOCK_ENTRY(Vector4, gShiftedLightPositionAndType) BS_PARAM_BLOCK_ENTRY(Vector4, gLightGeometry) BS_PARAM_BLOCK_ENTRY(Matrix4, gMatConeTransform) BS_PARAM_BLOCK_END extern PerLightParamDef gPerLightParamDef; /** Shader that renders directional light sources during deferred rendering light pass. */ template class DirectionalLightMat : public RendererMaterial> { RMAT_DEF("DeferredDirectionalLight.bsl"); public: DirectionalLightMat(); /** Binds the material for rendering and sets up any global parameters. */ void bind(const RenderTargets& renderTargets, const SPtr& perCamera); /** Updates the per-light buffers used by the material. */ void setPerLightParams(const SPtr& perLight); private: GBufferParams mGBufferParams; GpuParamTexture mLightOcclusionTexParam; }; /** Shader that renders point (radial & spot) light sources during deferred rendering light pass. */ template class PointLightMat : public RendererMaterial> { RMAT_DEF("DeferredPointLight.bsl"); public: PointLightMat(); /** Binds the material for rendering and sets up any global parameters. */ void bind(const RenderTargets& renderTargets, const SPtr& perCamera); /** Updates the per-light buffers used by the material. */ void setPerLightParams(const SPtr& perLight); private: GBufferParams mGBufferParams; GpuParamTexture mLightOcclusionTexParam; }; /** Provides functionality for standard (non-tiled) deferred rendering. */ class StandardDeferred : public Module { public: StandardDeferred(); /** Calculates lighting for the specified light, using the standard deferred renderer. */ void renderLight(LightType type, const RendererLight& light, const RendererView& view, const RenderTargets& renderTargets); private: SPtr mPerLightBuffer; PointLightMat mPointLightMat_TT; PointLightMat mPointLightMat_TF; PointLightMat mPointLightMat_FT; PointLightMat mPointLightMat_FF; DirectionalLightMat mDirLightMat_T; DirectionalLightMat mDirLightMat_F; }; }}