You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

180 lines
5.4 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkShadowMapPass.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkShadowMapPass
* @brief Implement a shadow mapping render pass.
*
* Render the opaque polygonal geometry of a scene with shadow maps (a
* technique to render hard shadows in hardware).
*
* This pass expects an initialized depth buffer and color buffer.
* Initialized buffers means they have been cleared with farest z-value and
* background color/gradient/transparent color.
* An opaque pass may have been performed right after the initialization.
*
*
*
* Its delegate is usually set to a vtkOpaquePass.
*
* @par Implementation:
* The first pass of the algorithm is to generate a shadow map per light
* (depth map from the light point of view) by rendering the opaque objects
* with the OCCLUDER property keys.
* The second pass is to render the opaque objects with the RECEIVER keys.
*
* @sa
* vtkRenderPass, vtkOpaquePass
*/
#ifndef vtkShadowMapPass_h
#define vtkShadowMapPass_h
#include "vtkOpenGLRenderPass.h"
#include "vtkRenderingOpenGL2Module.h" // For export macro
#include <string> // For member variables.
#include <vector> // STL Header
class vtkOpenGLRenderWindow;
class vtkInformationIntegerKey;
class vtkCamera;
class vtkLight;
class vtkFrameBufferObject;
class vtkShadowMapPassTextures; // internal
class vtkShadowMapPassLightCameras; // internal
class vtkShadowMapBakerPass;
class vtkInformationObjectBaseKey;
class vtkShaderProgram;
class VTKRENDERINGOPENGL2_EXPORT vtkShadowMapPass : public vtkOpenGLRenderPass
{
public:
static vtkShadowMapPass* New();
vtkTypeMacro(vtkShadowMapPass, vtkOpenGLRenderPass);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Perform rendering according to a render state \p s.
* \pre s_exists: s!=0
*/
void Render(const vtkRenderState* s) override;
/**
* Release graphics resources and ask components to release their own
* resources.
* \pre w_exists: w!=0
*/
void ReleaseGraphicsResources(vtkWindow* w) override;
//@{
/**
* Pass that generates the shadow maps.
* the vtkShadowMapPass will use the Resolution ivar of
* this pass.
* Initial value is a NULL pointer.
*/
vtkGetObjectMacro(ShadowMapBakerPass, vtkShadowMapBakerPass);
virtual void SetShadowMapBakerPass(vtkShadowMapBakerPass* shadowMapBakerPass);
//@}
//@{
/**
* Pass that render the lights and opaque geometry
* Typically a sequence pass with a light pass and opaque pass.
*/
vtkGetObjectMacro(OpaqueSequence, vtkRenderPass);
virtual void SetOpaqueSequence(vtkRenderPass* opaqueSequence);
//@}
/**
* get the matricies for all the
* shadow maps.
*/
std::vector<double> ShadowMapTransforms() { return this->ShadowTransforms; }
/**
* get the texture units for the shadow maps
* for each light. If a light does not cast a shadow
* it is set to -1
*/
std::vector<int> GetShadowMapTextureUnits() { return this->ShadowTextureUnits; }
/**
* this key will contain the shadow map pass
*/
static vtkInformationObjectBaseKey* ShadowMapPass();
/**
* Get the shader code to compute light factors based
* on a mappers vertexVC variable
*/
std::string GetFragmentDeclaration() { return this->FragmentDeclaration; }
std::string GetFragmentImplementation() { return this->FragmentImplementation; }
// vtkOpenGLRenderPass virtuals:
bool PreReplaceShaderValues(std::string& vertexShader, std::string& geometryShader,
std::string& fragmentShader, vtkAbstractMapper* mapper, vtkProp* prop) override;
bool PostReplaceShaderValues(std::string& vertexShader, std::string& geometryShader,
std::string& fragmentShader, vtkAbstractMapper* mapper, vtkProp* prop) override;
bool SetShaderParameters(vtkShaderProgram* program, vtkAbstractMapper* mapper, vtkProp* prop,
vtkOpenGLVertexArrayObject* VAO = nullptr) override;
protected:
/**
* Default constructor. DelegatetPass is set to NULL.
*/
vtkShadowMapPass();
/**
* Destructor.
*/
~vtkShadowMapPass() override;
/**
* Check if shadow mapping is supported by the current OpenGL context.
* \pre w_exists: w!=0
*/
void CheckSupport(vtkOpenGLRenderWindow* w);
vtkShadowMapBakerPass* ShadowMapBakerPass;
vtkRenderPass* CompositeRGBAPass;
vtkRenderPass* OpaqueSequence;
/**
* Graphics resources.
*/
vtkFrameBufferObject* FrameBufferObject;
vtkShadowMapPassTextures* ShadowMaps;
vtkShadowMapPassLightCameras* LightCameras;
vtkTimeStamp LastRenderTime;
// to store the shader code and settings
void BuildShaderCode();
std::string FragmentDeclaration;
std::string FragmentImplementation;
std::vector<int> ShadowTextureUnits;
std::vector<double> ShadowTransforms;
std::vector<float> ShadowAttenuation;
std::vector<int> ShadowParallel;
private:
vtkShadowMapPass(const vtkShadowMapPass&) = delete;
void operator=(const vtkShadowMapPass&) = delete;
};
#endif