VTK  9.3.0
vtkOpenGLGPUVolumeRayCastMapper.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-License-Identifier: BSD-3-Clause
70 #ifndef vtkOpenGLGPUVolumeRayCastMapper_h
71 #define vtkOpenGLGPUVolumeRayCastMapper_h
72 #include <map> // For methods
73 
75 #include "vtkNew.h" // For vtkNew
76 #include "vtkRenderingVolumeOpenGL2Module.h" // For export macro
77 #include "vtkShader.h" // For methods
78 #include "vtkSmartPointer.h" // For smartptr
79 
80 VTK_ABI_NAMESPACE_BEGIN
83 class vtkOpenGLCamera;
84 class vtkOpenGLTransferFunctions2D;
85 class vtkOpenGLVolumeGradientOpacityTables;
86 class vtkOpenGLVolumeOpacityTables;
87 class vtkOpenGLVolumeRGBTables;
88 class vtkShaderProgram;
89 class vtkTextureObject;
90 class vtkVolume;
92 class vtkVolumeTexture;
94 
95 class VTKRENDERINGVOLUMEOPENGL2_EXPORT vtkOpenGLGPUVolumeRayCastMapper
97 {
98 public:
100 
101  enum Passes
102  {
104  DepthPass = 1
105  };
106 
108  void PrintSelf(ostream& os, vtkIndent indent) override;
109 
110  // Description:
111  // Low level API to enable access to depth texture in
112  // RenderToTexture mode. It will return either nullptr if
113  // RenderToImage was never turned on or texture captured
114  // the last time RenderToImage was on.
116 
117  // Description:
118  // Low level API to enable access to color texture in
119  // RenderToTexture mode. It will return either nullptr if
120  // RenderToImage was never turned on or texture captured
121  // the last time RenderToImage was on.
123 
124  // Description:
125  // Low level API to export the depth texture as vtkImageData in
126  // RenderToImage mode.
127  void GetDepthImage(vtkImageData* im) override;
128 
129  // Description:
130  // Low level API to export the color texture as vtkImageData in
131  // RenderToImage mode.
132  void GetColorImage(vtkImageData* im) override;
133 
134  // Description:
135  // Mapper can have multiple passes and internally it will set
136  // the state. The state can not be set externally explicitly
137  // but can be set indirectly depending on the options set by
138  // the user.
139  vtkGetMacro(CurrentPass, int);
140 
141  // Sets a depth texture for this mapper to use
142  // This allows many mappers to use the same
143  // texture reducing GPU usage. If this is set
144  // the standard depth texture code is skipped
145  // The depth texture should be activated
146  // and deactivated outside of this class
148 
154  void SetPartitions(unsigned short x, unsigned short y, unsigned short z);
155 
165 
166  // Description:
167  // Delete OpenGL objects.
168  // \post done: this->OpenGLObjectsCreated==0
169  void ReleaseGraphicsResources(vtkWindow* window) override;
170 
171 protected:
174 
176 
177  // Description:
178  // Build vertex and fragment shader for the volume rendering
180  vtkRenderer* ren, vtkVolume* vol, int noOfComponents, int independentComponents);
181 
182  // Description:
183  // Build vertex and fragment shader for the volume rendering
185 
186  // TODO Take these out as these are no longer needed
187  // Methods called by the AMR Volume Mapper.
188  void PreRender(vtkRenderer* vtkNotUsed(ren), vtkVolume* vtkNotUsed(vol),
189  double vtkNotUsed(datasetBounds)[6], double vtkNotUsed(scalarRange)[2],
190  int vtkNotUsed(noOfComponents), unsigned int vtkNotUsed(numberOfLevels)) override
191  {
192  }
193 
194  // \pre input is up-to-date
195  void RenderBlock(vtkRenderer* vtkNotUsed(ren), vtkVolume* vtkNotUsed(vol),
196  unsigned int vtkNotUsed(level)) override
197  {
198  }
199 
200  void PostRender(vtkRenderer* vtkNotUsed(ren), int vtkNotUsed(noOfComponents)) override {}
201 
202  // Description:
203  // Rendering volume on GPU
204  void GPURender(vtkRenderer* ren, vtkVolume* vol) override;
205 
206  // Description:
207  // Method that performs the actual rendering given a volume and a shader
208  void DoGPURender(vtkRenderer* ren, vtkOpenGLCamera* cam, vtkShaderProgram* shaderProgram,
209  vtkOpenGLShaderProperty* shaderProperty);
210 
211  // Description:
212  // Update the reduction factor of the render viewport (this->ReductionFactor)
213  // according to the time spent in seconds to render the previous frame
214  // (this->TimeToDraw) and a time in seconds allocated to render the next
215  // frame (allocatedTime).
216  // \pre valid_current_reduction_range: this->ReductionFactor>0.0 && this->ReductionFactor<=1.0
217  // \pre positive_TimeToDraw: this->TimeToDraw>=0.0
218  // \pre positive_time: allocatedTime>0
219  // \post valid_new_reduction_range: this->ReductionFactor>0.0 && this->ReductionFactor<=1.0
220  void ComputeReductionFactor(double allocatedTime);
221 
222  // Description:
223  // Returns a reduction ratio for each dimension
224  // This ratio is computed from MaxMemoryInBytes and MaxMemoryFraction so that the total
225  // memory usage of the resampled image, by the returned ratio, does not exceed
226  // `MaxMemoryInBytes * MaxMemoryFraction`
227  // \pre input is up-to-date
228  // \post Aspect ratio of image is always kept
229  // - for a 1D image `ratio[1] == ratio[2] == 1`
230  // - for a 2D image `ratio[0] == ratio[1]` and `ratio[2] == 1`
231  // - for a 3D image `ratio[0] == ratio[1] == ratio[2]`
232  void GetReductionRatio(double* ratio) override;
233 
234  // Description:
235  // Empty implementation.
237  vtkRenderWindow* vtkNotUsed(window), vtkVolumeProperty* vtkNotUsed(property)) override
238  {
239  return 1;
240  }
241 
243 
247 
252  std::map<vtkShader::Type, vtkShader*>& shaders, vtkOpenGLShaderProperty* p);
253 
258  std::map<vtkShader::Type, vtkShader*>& shaders, vtkRenderer* ren, vtkVolume* vol, int numComps);
259 
265  std::map<vtkShader::Type, vtkShader*>& shaders, vtkOpenGLShaderProperty* p);
267  std::map<vtkShader::Type, vtkShader*>& shaders, vtkRenderer* ren, vtkVolume* vol, int numComps);
269  std::map<vtkShader::Type, vtkShader*>& shaders, vtkRenderer* ren, vtkVolume* vol, int numComps);
271  std::map<vtkShader::Type, vtkShader*>& shaders, vtkRenderer* ren, vtkVolume* vol, int numComps);
273  std::map<vtkShader::Type, vtkShader*>& shaders, vtkRenderer* ren, vtkVolume* vol, int numComps);
275  std::map<vtkShader::Type, vtkShader*>& shaders, vtkRenderer* ren, vtkVolume* vol, int numComps);
277  std::map<vtkShader::Type, vtkShader*>& shaders, vtkRenderer* ren, vtkVolume* vol, int numComps);
279  std::map<vtkShader::Type, vtkShader*>& shaders, vtkRenderer* ren, vtkVolume* vol, int numComps);
281  std::map<vtkShader::Type, vtkShader*>& shaders, vtkRenderer* ren, vtkVolume* vol, int numComps);
283  std::map<vtkShader::Type, vtkShader*>& shaders, vtkRenderer* ren, vtkVolume* vol, int numComps);
285  std::map<vtkShader::Type, vtkShader*>& shaders, vtkVolume* vol, bool prePass);
286 
291 
299 
302 
303 public:
305  using VolumeInputMap = std::map<int, vtkVolumeInputHelper>;
307 
308 private:
309  class vtkInternal;
310  vtkInternal* Impl;
311 
312  friend class vtkVolumeTexture;
313 
315  void operator=(const vtkOpenGLGPUVolumeRayCastMapper&) = delete;
316 };
317 
318 VTK_ABI_NAMESPACE_END
319 #endif // vtkOpenGLGPUVolumeRayCastMapper_h
Ray casting performed on the GPU.
topologically and geometrically regular array of data
Definition: vtkImageData.h:52
abstract interface for implicit functions
a simple class to control print indentation
Definition: vtkIndent.h:38
OpenGL camera.
OpenGL implementation of volume rendering through ray-casting.
void GetColorImage(vtkImageData *im) override
Low level API to export the color texture as vtkImageData in RenderToImage mode.
vtkTextureObject * GetDepthTexture()
void ReplaceShaderRTT(std::map< vtkShader::Type, vtkShader * > &shaders, vtkRenderer *ren, vtkVolume *vol, int numComps)
Caches the vtkOpenGLRenderPass::RenderPasses() information.
void SetShaderParametersRenderPass()
Update parameters from RenderPass.
void PreRender(vtkRenderer *vtkNotUsed(ren), vtkVolume *vtkNotUsed(vol), double vtkNotUsed(datasetBounds)[6], double vtkNotUsed(scalarRange)[2], int vtkNotUsed(noOfComponents), unsigned int vtkNotUsed(numberOfLevels)) override
void ReplaceShaderCustomUniforms(std::map< vtkShader::Type, vtkShader * > &shaders, vtkOpenGLShaderProperty *p)
RenderPass string replacements on shader templates called from ReplaceShaderValues.
void GetShaderTemplate(std::map< vtkShader::Type, vtkShader * > &shaders, vtkOpenGLShaderProperty *p)
Create the basic shader template strings before substitutions.
void GetDepthImage(vtkImageData *im) override
Low level API to export the depth texture as vtkImageData in RenderToImage mode.
static vtkOpenGLGPUVolumeRayCastMapper * New()
void BuildShader(vtkRenderer *ren)
void ReplaceShaderCropping(std::map< vtkShader::Type, vtkShader * > &shaders, vtkRenderer *ren, vtkVolume *vol, int numComps)
Caches the vtkOpenGLRenderPass::RenderPasses() information.
void ReplaceShaderRenderPass(std::map< vtkShader::Type, vtkShader * > &shaders, vtkVolume *vol, bool prePass)
Caches the vtkOpenGLRenderPass::RenderPasses() information.
vtkTextureObject * GetColorTexture()
void DoGPURender(vtkRenderer *ren, vtkOpenGLCamera *cam, vtkShaderProgram *shaderProgram, vtkOpenGLShaderProperty *shaderProperty)
std::map< int, vtkVolumeInputHelper > VolumeInputMap
bool PreLoadData(vtkRenderer *ren, vtkVolume *vol)
Load the volume texture into GPU memory.
void ReplaceShaderTermination(std::map< vtkShader::Type, vtkShader * > &shaders, vtkRenderer *ren, vtkVolume *vol, int numComps)
Caches the vtkOpenGLRenderPass::RenderPasses() information.
void RenderBlock(vtkRenderer *vtkNotUsed(ren), vtkVolume *vtkNotUsed(vol), unsigned int vtkNotUsed(level)) override
void PostRender(vtkRenderer *vtkNotUsed(ren), int vtkNotUsed(noOfComponents)) override
void SetSharedDepthTexture(vtkTextureObject *nt)
void ComputeReductionFactor(double allocatedTime)
void ReplaceShaderPicking(std::map< vtkShader::Type, vtkShader * > &shaders, vtkRenderer *ren, vtkVolume *vol, int numComps)
Caches the vtkOpenGLRenderPass::RenderPasses() information.
void ReplaceShaderBase(std::map< vtkShader::Type, vtkShader * > &shaders, vtkRenderer *ren, vtkVolume *vol, int numComps)
Caches the vtkOpenGLRenderPass::RenderPasses() information.
void GetReductionRatio(double *ratio) override
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
void ReplaceShaderClipping(std::map< vtkShader::Type, vtkShader * > &shaders, vtkRenderer *ren, vtkVolume *vol, int numComps)
Caches the vtkOpenGLRenderPass::RenderPasses() information.
vtkMTimeType GetRenderPassStageMTime(vtkVolume *vol)
vtkOpenGLRenderPass API
void ReplaceShaderCompute(std::map< vtkShader::Type, vtkShader * > &shaders, vtkRenderer *ren, vtkVolume *vol, int numComps)
Caches the vtkOpenGLRenderPass::RenderPasses() information.
void ReplaceShaderMasking(std::map< vtkShader::Type, vtkShader * > &shaders, vtkRenderer *ren, vtkVolume *vol, int numComps)
Caches the vtkOpenGLRenderPass::RenderPasses() information.
void BuildDepthPassShader(vtkRenderer *ren, vtkVolume *vol, int noOfComponents, int independentComponents)
vtkGenericOpenGLResourceFreeCallback * ResourceCallback
void SetPartitions(unsigned short x, unsigned short y, unsigned short z)
Set a fixed number of partitions in which to split the volume during rendering.
vtkNew< vtkInformation > LastRenderPassInfo
Caches the vtkOpenGLRenderPass::RenderPasses() information.
void GPURender(vtkRenderer *ren, vtkVolume *vol) override
Handled in the subclass - the actual render method.
void ReplaceShaderValues(std::map< vtkShader::Type, vtkShader * > &shaders, vtkRenderer *ren, vtkVolume *vol, int numComps)
Perform string replacements on the shader templates.
void ReleaseGraphicsResources(vtkWindow *window) override
Release any graphics resources that are being consumed by this mapper.
void ReplaceShaderShading(std::map< vtkShader::Type, vtkShader * > &shaders, vtkRenderer *ren, vtkVolume *vol, int numComps)
Caches the vtkOpenGLRenderPass::RenderPasses() information.
int IsRenderSupported(vtkRenderWindow *vtkNotUsed(window), vtkVolumeProperty *vtkNotUsed(property)) override
Based on hardware and properties, we may or may not be able to render using 3D texture mapping.
represent GPU shader properties
create a window for renderers to draw into
abstract specification for renderers
Definition: vtkRenderer.h:71
The ShaderProgram uses one or more Shader objects.
abstracts an OpenGL texture object.
Convenience container for internal structures specific to a volume input.
represents the common properties for rendering a volume.
Creates and manages the volume texture rendered by vtkOpenGLGPUVolumeRayCastMapper.
represents a volume (data & properties) in a rendered scene
Definition: vtkVolume.h:49
window superclass for vtkRenderWindow
Definition: vtkWindow.h:37
@ level
Definition: vtkX3D.h:395
vtkTypeUInt32 vtkMTimeType
Definition: vtkType.h:270