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.
237 lines
6.8 KiB
C
237 lines
6.8 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkOpenGLRenderer.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 vtkOpenGLRenderer
|
||
|
* @brief OpenGL renderer
|
||
|
*
|
||
|
* vtkOpenGLRenderer is a concrete implementation of the abstract class
|
||
|
* vtkRenderer. vtkOpenGLRenderer interfaces to the OpenGL graphics library.
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkOpenGLRenderer_h
|
||
|
#define vtkOpenGLRenderer_h
|
||
|
|
||
|
#include "vtkRenderer.h"
|
||
|
#include "vtkRenderingOpenGL2Module.h" // For export macro
|
||
|
#include "vtkSmartPointer.h" // For vtkSmartPointer
|
||
|
#include <string> // Ivars
|
||
|
#include <vector> // STL Header
|
||
|
|
||
|
class vtkOpenGLFXAAFilter;
|
||
|
class vtkRenderPass;
|
||
|
class vtkOpenGLState;
|
||
|
class vtkOpenGLTexture;
|
||
|
class vtkOrderIndependentTranslucentPass;
|
||
|
class vtkTextureObject;
|
||
|
class vtkDepthPeelingPass;
|
||
|
class vtkPBRIrradianceTexture;
|
||
|
class vtkPBRLUTTexture;
|
||
|
class vtkPBRPrefilterTexture;
|
||
|
class vtkShaderProgram;
|
||
|
class vtkShadowMapPass;
|
||
|
|
||
|
class VTKRENDERINGOPENGL2_EXPORT vtkOpenGLRenderer : public vtkRenderer
|
||
|
{
|
||
|
public:
|
||
|
static vtkOpenGLRenderer* New();
|
||
|
vtkTypeMacro(vtkOpenGLRenderer, vtkRenderer);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
|
||
|
/**
|
||
|
* Concrete open gl render method.
|
||
|
*/
|
||
|
void DeviceRender(void) override;
|
||
|
|
||
|
/**
|
||
|
* Overridden to support hidden line removal.
|
||
|
*/
|
||
|
void DeviceRenderOpaqueGeometry(vtkFrameBufferObjectBase* fbo = nullptr) override;
|
||
|
|
||
|
/**
|
||
|
* Render translucent polygonal geometry. Default implementation just call
|
||
|
* UpdateTranslucentPolygonalGeometry().
|
||
|
* Subclasses of vtkRenderer that can deal with depth peeling must
|
||
|
* override this method.
|
||
|
*/
|
||
|
void DeviceRenderTranslucentPolygonalGeometry(vtkFrameBufferObjectBase* fbo = nullptr) override;
|
||
|
|
||
|
void Clear(void) override;
|
||
|
|
||
|
/**
|
||
|
* Ask lights to load themselves into graphics pipeline.
|
||
|
*/
|
||
|
int UpdateLights(void) override;
|
||
|
|
||
|
/**
|
||
|
* Is rendering at translucent geometry stage using depth peeling and
|
||
|
* rendering a layer other than the first one? (Boolean value)
|
||
|
* If so, the uniform variables UseTexture and Texture can be set.
|
||
|
* (Used by vtkOpenGLProperty or vtkOpenGLTexture)
|
||
|
*/
|
||
|
int GetDepthPeelingHigherLayer();
|
||
|
|
||
|
/**
|
||
|
* Indicate if this system is subject to the Apple/AMD bug
|
||
|
* of not having a working glPrimitiveId <rdar://20747550>.
|
||
|
* The bug is fixed on macOS 10.11 and later, and this method
|
||
|
* will return false when the OS is new enough.
|
||
|
*/
|
||
|
bool HaveApplePrimitiveIdBug();
|
||
|
|
||
|
/**
|
||
|
* Indicate if this system is subject to the apple/NVIDIA bug that causes
|
||
|
* crashes in the driver when too many query objects are allocated.
|
||
|
*/
|
||
|
static bool HaveAppleQueryAllocationBug();
|
||
|
|
||
|
/**
|
||
|
* Dual depth peeling may be disabled for certain runtime configurations.
|
||
|
* This method returns true if vtkDualDepthPeelingPass will be used in place
|
||
|
* of vtkDepthPeelingPass.
|
||
|
*/
|
||
|
bool IsDualDepthPeelingSupported();
|
||
|
|
||
|
// Get the state object used to keep track of
|
||
|
// OpenGL state
|
||
|
vtkOpenGLState* GetState();
|
||
|
|
||
|
// get the standard lighting uniform declarations
|
||
|
// for the current set of lights
|
||
|
const char* GetLightingUniforms();
|
||
|
|
||
|
// update the lighting uniforms for this shader if they
|
||
|
// are out of date
|
||
|
void UpdateLightingUniforms(vtkShaderProgram* prog);
|
||
|
|
||
|
// get the complexity of the current lights as a int
|
||
|
// 0 = no lighting
|
||
|
// 1 = headlight
|
||
|
// 2 = directional lights
|
||
|
// 3 = positional lights
|
||
|
enum LightingComplexityEnum
|
||
|
{
|
||
|
NoLighting = 0,
|
||
|
Headlight = 1,
|
||
|
Directional = 2,
|
||
|
Positional = 3
|
||
|
};
|
||
|
vtkGetMacro(LightingComplexity, int);
|
||
|
|
||
|
// get the number of lights turned on
|
||
|
vtkGetMacro(LightingCount, int);
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set the user light transform applied after the camera transform.
|
||
|
* Can be null to disable it.
|
||
|
*/
|
||
|
void SetUserLightTransform(vtkTransform* transform);
|
||
|
vtkTransform* GetUserLightTransform();
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Get environment textures used for image based lighting.
|
||
|
*/
|
||
|
vtkPBRLUTTexture* GetEnvMapLookupTable();
|
||
|
vtkPBRIrradianceTexture* GetEnvMapIrradiance();
|
||
|
vtkPBRPrefilterTexture* GetEnvMapPrefiltered();
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Overriden in order to connect the texture to the environment map textures.
|
||
|
*/
|
||
|
void SetEnvironmentTexture(vtkTexture* texture, bool isSRGB = false) override;
|
||
|
|
||
|
// Method to release graphics resources
|
||
|
void ReleaseGraphicsResources(vtkWindow* w) override;
|
||
|
|
||
|
protected:
|
||
|
vtkOpenGLRenderer();
|
||
|
~vtkOpenGLRenderer() override;
|
||
|
|
||
|
/**
|
||
|
* Check the compilation status of some fragment shader source.
|
||
|
*/
|
||
|
void CheckCompilation(unsigned int fragmentShader);
|
||
|
|
||
|
/**
|
||
|
* Ask all props to update and draw any opaque and translucent
|
||
|
* geometry. This includes both vtkActors and vtkVolumes
|
||
|
* Returns the number of props that rendered geometry.
|
||
|
*/
|
||
|
int UpdateGeometry(vtkFrameBufferObjectBase* fbo = nullptr) override;
|
||
|
|
||
|
/**
|
||
|
* Check and return the textured background for the current state
|
||
|
* If monocular or stereo left eye, check BackgroundTexture
|
||
|
* If stereo right eye, check RightBackgroundTexture
|
||
|
*/
|
||
|
vtkTexture* GetCurrentTexturedBackground();
|
||
|
|
||
|
friend class vtkOpenGLProperty;
|
||
|
friend class vtkOpenGLTexture;
|
||
|
friend class vtkOpenGLImageSliceMapper;
|
||
|
friend class vtkOpenGLImageResliceMapper;
|
||
|
|
||
|
/**
|
||
|
* FXAA is delegated to an instance of vtkOpenGLFXAAFilter
|
||
|
*/
|
||
|
vtkOpenGLFXAAFilter* FXAAFilter;
|
||
|
|
||
|
/**
|
||
|
* Depth peeling is delegated to an instance of vtkDepthPeelingPass
|
||
|
*/
|
||
|
vtkDepthPeelingPass* DepthPeelingPass;
|
||
|
|
||
|
/**
|
||
|
* Fallback for transparency
|
||
|
*/
|
||
|
vtkOrderIndependentTranslucentPass* TranslucentPass;
|
||
|
|
||
|
/**
|
||
|
* Shadows are delegated to an instance of vtkShadowMapPass
|
||
|
*/
|
||
|
vtkShadowMapPass* ShadowMapPass;
|
||
|
|
||
|
// Is rendering at translucent geometry stage using depth peeling and
|
||
|
// rendering a layer other than the first one? (Boolean value)
|
||
|
// If so, the uniform variables UseTexture and Texture can be set.
|
||
|
// (Used by vtkOpenGLProperty or vtkOpenGLTexture)
|
||
|
int DepthPeelingHigherLayer;
|
||
|
|
||
|
friend class vtkRenderPass;
|
||
|
|
||
|
std::string LightingDeclaration;
|
||
|
int LightingComplexity;
|
||
|
int LightingCount;
|
||
|
vtkMTimeType LightingUpdateTime;
|
||
|
|
||
|
/**
|
||
|
* Optional user transform for lights
|
||
|
*/
|
||
|
vtkSmartPointer<vtkTransform> UserLightTransform;
|
||
|
|
||
|
vtkPBRLUTTexture* EnvMapLookupTable;
|
||
|
vtkPBRIrradianceTexture* EnvMapIrradiance;
|
||
|
vtkPBRPrefilterTexture* EnvMapPrefiltered;
|
||
|
|
||
|
private:
|
||
|
vtkOpenGLRenderer(const vtkOpenGLRenderer&) = delete;
|
||
|
void operator=(const vtkOpenGLRenderer&) = delete;
|
||
|
};
|
||
|
|
||
|
#endif
|