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.
149 lines
4.2 KiB
C++
149 lines
4.2 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkSSAOPass.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 vtkSSAOPass
|
|
* @brief Implement a screen-space ambient occlusion pass.
|
|
*
|
|
* SSAO darkens some pixels to improve depth perception simulating ambient occlusion
|
|
* in screen space.
|
|
* For each fragment, random samples inside a hemisphere at the fragment position oriented with
|
|
* the normal are tested against other fragments to compute an average occlusion.
|
|
* The number of samples and the radius of the hemisphere are configurables.
|
|
*
|
|
* @sa
|
|
* vtkRenderPass
|
|
*/
|
|
|
|
#ifndef vtkSSAOPass_h
|
|
#define vtkSSAOPass_h
|
|
|
|
#include "vtkImageProcessingPass.h"
|
|
#include "vtkRenderingOpenGL2Module.h" // For export macro
|
|
|
|
#include <vector> // For vector
|
|
|
|
class vtkMatrix4x4;
|
|
class vtkOpenGLFramebufferObject;
|
|
class vtkOpenGLQuadHelper;
|
|
class vtkTextureObject;
|
|
|
|
class VTKRENDERINGOPENGL2_EXPORT vtkSSAOPass : public vtkImageProcessingPass
|
|
{
|
|
public:
|
|
static vtkSSAOPass* New();
|
|
vtkTypeMacro(vtkSSAOPass, vtkImageProcessingPass);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
/**
|
|
* Perform rendering according to a render state.
|
|
*/
|
|
void Render(const vtkRenderState* s) override;
|
|
|
|
/**
|
|
* Release graphics resources and ask components to release their own resources.
|
|
*/
|
|
void ReleaseGraphicsResources(vtkWindow* w) override;
|
|
|
|
/**
|
|
* Pre replace shader values
|
|
*/
|
|
bool PreReplaceShaderValues(std::string& vertexShader, std::string& geometryShader,
|
|
std::string& fragmentShader, vtkAbstractMapper* mapper, vtkProp* prop) override;
|
|
|
|
/**
|
|
* Post replace shader values
|
|
*/
|
|
bool PostReplaceShaderValues(std::string& vertexShader, std::string& geometryShader,
|
|
std::string& fragmentShader, vtkAbstractMapper* mapper, vtkProp* prop) override;
|
|
|
|
/**
|
|
* Set shader parameters. Set the draw buffers depending on the mapper.
|
|
*/
|
|
bool SetShaderParameters(vtkShaderProgram* program, vtkAbstractMapper* mapper, vtkProp* prop,
|
|
vtkOpenGLVertexArrayObject* VAO = nullptr) override;
|
|
|
|
//@{
|
|
/**
|
|
* Get/Set the SSAO hemisphere radius.
|
|
* Default is 0.5
|
|
*/
|
|
vtkGetMacro(Radius, double);
|
|
vtkSetMacro(Radius, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Get/Set the number of samples.
|
|
* Default is 32
|
|
*/
|
|
vtkGetMacro(KernelSize, unsigned int);
|
|
vtkSetClampMacro(KernelSize, unsigned int, 1, 1000);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Get/Set the bias when comparing samples.
|
|
* Default is 0.01
|
|
*/
|
|
vtkGetMacro(Bias, double);
|
|
vtkSetMacro(Bias, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Get/Set blurring of the ambient occlusion.
|
|
* Blurring can help to improve the result if samples number is low.
|
|
* Default is false
|
|
*/
|
|
vtkGetMacro(Blur, bool);
|
|
vtkSetMacro(Blur, bool);
|
|
vtkBooleanMacro(Blur, bool);
|
|
//@}
|
|
|
|
protected:
|
|
vtkSSAOPass() = default;
|
|
~vtkSSAOPass() override = default;
|
|
|
|
void ComputeKernel();
|
|
void InitializeGraphicsResources(vtkOpenGLRenderWindow* renWin, int w, int h);
|
|
|
|
void RenderDelegate(const vtkRenderState* s, int w, int h);
|
|
void RenderSSAO(vtkOpenGLRenderWindow* renWin, vtkMatrix4x4* projection, int w, int h);
|
|
void RenderCombine(vtkOpenGLRenderWindow* renWin);
|
|
|
|
vtkTextureObject* ColorTexture = nullptr;
|
|
vtkTextureObject* PositionTexture = nullptr;
|
|
vtkTextureObject* NormalTexture = nullptr;
|
|
vtkTextureObject* SSAOTexture = nullptr;
|
|
vtkTextureObject* DepthTexture = nullptr;
|
|
|
|
vtkOpenGLFramebufferObject* FrameBufferObject = nullptr;
|
|
|
|
vtkOpenGLQuadHelper* SSAOQuadHelper = nullptr;
|
|
vtkOpenGLQuadHelper* CombineQuadHelper = nullptr;
|
|
|
|
std::vector<float> Kernel;
|
|
unsigned int KernelSize = 32;
|
|
double Radius = 0.5;
|
|
double Bias = 0.01;
|
|
bool Blur = false;
|
|
|
|
private:
|
|
vtkSSAOPass(const vtkSSAOPass&) = delete;
|
|
void operator=(const vtkSSAOPass&) = delete;
|
|
};
|
|
|
|
#endif
|