VTK
vtkOpenGLGPUVolumeRayCastMapper.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkOpenGLGPUVolumeRayCastMapper.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
15 
16 #ifndef vtkOpenGLGPUVolumeRayCastMapper_h
17 #define vtkOpenGLGPUVolumeRayCastMapper_h
18 
19 // VTK includes
20 #include "vtkNew.h" // For vtkNew
21 #include "vtkRenderingVolumeOpenGL2Module.h" // For export macro
23 #include "vtkShader.h" // For methods
24 
25 // STL includes
26 #include <map> // For shader replacements
27 
28 // Forward declarations
31 class vtkOpenGLCamera;
32 class vtkShaderProgram;
33 class vtkTextureObject;
34 class vtkVolumeTexture;
35 
36 //----------------------------------------------------------------------------
37 class VTKRENDERINGVOLUMEOPENGL2_EXPORT vtkOpenGLGPUVolumeRayCastMapper :
39 {
40 public:
42 
43  enum Passes
44  {
46  DepthPass = 1
47  };
48 
50  void PrintSelf( ostream& os, vtkIndent indent ) override;
51 
52  // Description:
53  // Low level API to enable access to depth texture in
54  // RenderToTexture mode. It will return either NULL if
55  // RenderToImage was never turned on or texture captured
56  // the last time RenderToImage was on.
57  vtkTextureObject* GetDepthTexture();
58 
59  // Description:
60  // Low level API to enable access to color texture in
61  // RenderToTexture mode. It will return either NULL if
62  // RenderToImage was never turned on or texture captured
63  // the last time RenderToImage was on.
64  vtkTextureObject* GetColorTexture();
65 
66  // Description:
67  // Low level API to export the depth texture as vtkImageData in
68  // RenderToImage mode.
69  void GetDepthImage(vtkImageData* im) override;
70 
71  // Description:
72  // Low level API to export the color texture as vtkImageData in
73  // RenderToImage mode.
74  void GetColorImage(vtkImageData* im) override;
75 
76  // Description:
77  // Mapper can have multiple passes and internally it will set
78  // the state. The state can not be set externally explicitly
79  // but can be set indirectly depending on the options set by
80  // the user.
81  vtkGetMacro(CurrentPass, int);
82 
84 
90  void SetNoiseGenerator(vtkImplicitFunction* generator);
91  vtkSetVector2Macro(NoiseTextureSize, int);
93 
99  void SetPartitions(unsigned short x, unsigned short y, unsigned short z);
100 
109  bool PreLoadData(vtkRenderer* ren, vtkVolume* vol);
110 
112 
119  void AddShaderReplacement(
120  vtkShader::Type shaderType, // vertex, fragment, etc
121  const std::string& originalValue,
122  bool replaceFirst, // do this replacement before the default
123  const std::string& replacementValue,
124  bool replaceAll);
125  void ClearShaderReplacement(
126  vtkShader::Type shaderType, // vertex, fragment, etc
127  const std::string& originalValue,
128  bool replaceFirst);
130 
132 
138  vtkSetStringMacro(VertexShaderCode);
139  vtkGetStringMacro(VertexShaderCode);
140  vtkSetStringMacro(FragmentShaderCode);
141  vtkGetStringMacro(FragmentShaderCode);
143 
144 protected:
147 
148  // Description:
149  // Delete OpenGL objects.
150  // \post done: this->OpenGLObjectsCreated==0
151  void ReleaseGraphicsResources(vtkWindow *window) override;
153 
154  // Description:
155  // Build vertex and fragment shader for the volume rendering
156  void BuildDepthPassShader(vtkRenderer* ren, vtkVolume* vol,
157  int noOfComponents,
158  int independentComponents);
159 
160  // Description:
161  // Build vertex and fragment shader for the volume rendering
162  void BuildShader(vtkRenderer* ren, vtkVolume* vol, int noOfCmponents);
163 
164  // TODO Take these out as these are no longer needed
165  // Methods called by the AMR Volume Mapper.
166  void PreRender(vtkRenderer * vtkNotUsed(ren),
167  vtkVolume *vtkNotUsed(vol),
168  double vtkNotUsed(datasetBounds)[6],
169  double vtkNotUsed(scalarRange)[2],
170  int vtkNotUsed(noOfComponents),
171  unsigned int vtkNotUsed(numberOfLevels)) override {};
172 
173  // \pre input is up-to-date
174  void RenderBlock(vtkRenderer *vtkNotUsed(ren),
175  vtkVolume *vtkNotUsed(vol),
176  unsigned int vtkNotUsed(level)) override {}
177 
178  void PostRender(vtkRenderer *vtkNotUsed(ren),
179  int vtkNotUsed(noOfComponents)) override {}
180 
181  // Description:
182  // Rendering volume on GPU
183  void GPURender(vtkRenderer *ren, vtkVolume *vol) override;
184 
185  // Description:
186  // Method that performs the actual rendering given a volume and a shader
187  void DoGPURender(vtkRenderer* ren,
188  vtkVolume* vol,
189  vtkOpenGLCamera* cam,
190  vtkShaderProgram* shaderProgram,
191  int noOfComponents,
192  int independentComponents);
193 
194  // Description:
195  // Update the reduction factor of the render viewport (this->ReductionFactor)
196  // according to the time spent in seconds to render the previous frame
197  // (this->TimeToDraw) and a time in seconds allocated to render the next
198  // frame (allocatedTime).
199  // \pre valid_current_reduction_range: this->ReductionFactor>0.0 && this->ReductionFactor<=1.0
200  // \pre positive_TimeToDraw: this->TimeToDraw>=0.0
201  // \pre positive_time: allocatedTime>0
202  // \post valid_new_reduction_range: this->ReductionFactor>0.0 && this->ReductionFactor<=1.0
203  void ComputeReductionFactor(double allocatedTime);
204 
205  // Description:
206  // Empty implementation.
207  void GetReductionRatio(double* ratio) override
208  {
209  ratio[0] = ratio[1] = ratio[2] = 1.0;
210  }
211 
212 
213  // Description:
214  // Empty implementation.
215  int IsRenderSupported(vtkRenderWindow *vtkNotUsed(window),
216  vtkVolumeProperty *vtkNotUsed(property)) override
217  {
218  return 1;
219  }
220 
222 
225  vtkMTimeType GetRenderPassStageMTime(vtkVolume* vol);
226 
230  void GetShaderTemplate(std::map<vtkShader::Type, vtkShader*>& shaders);
231 
235  void ReplaceShaderValues(std::map<vtkShader::Type, vtkShader*>& shaders,
236  vtkRenderer* ren, vtkVolume* vol, int numComps);
237 
242  void ReplaceShaderBase(std::map<vtkShader::Type, vtkShader*>& shaders,
243  vtkRenderer* ren, vtkVolume* vol, int numComps);
244  void ReplaceShaderTermination(std::map<vtkShader::Type, vtkShader*>& shaders,
245  vtkRenderer* ren, vtkVolume* vol, int numComps);
246  void ReplaceShaderShading(std::map<vtkShader::Type, vtkShader*>& shaders,
247  vtkRenderer* ren, vtkVolume* vol, int numComps);
248  void ReplaceShaderCompute(std::map<vtkShader::Type, vtkShader*>& shaders,
249  vtkRenderer* ren, vtkVolume* vol, int numComps);
250  void ReplaceShaderCropping(std::map<vtkShader::Type, vtkShader*>& shaders,
251  vtkRenderer* ren, vtkVolume* vol, int numComps);
252  void ReplaceShaderClipping(std::map<vtkShader::Type, vtkShader*>& shaders,
253  vtkRenderer* ren, vtkVolume* vol, int numComps);
254  void ReplaceShaderMasking(std::map<vtkShader::Type, vtkShader*>& shaders,
255  vtkRenderer* ren, vtkVolume* vol, int numComps);
256  void ReplaceShaderPicking(std::map<vtkShader::Type, vtkShader*>& shaders,
257  vtkRenderer* ren, vtkVolume* vol, int numComps);
258  void ReplaceShaderRTT(std::map<vtkShader::Type, vtkShader*>& shaders,
259  vtkRenderer* ren, vtkVolume* vol, int numComps);
260  void ReplaceShaderRenderPass(std::map<vtkShader::Type, vtkShader*>& shaders,
261  vtkVolume* vol, bool prePass);
262 
266  void SetShaderParametersRenderPass(vtkVolume* vol);
267 
275 
276  double ReductionFactor;
280  std::map<const vtkShader::ReplacementSpec, vtkShader::ReplacementValue>
282 
283 private:
284  class vtkInternal;
285  vtkInternal* Impl;
286 
287  friend class vtkVolumeTexture;
288  vtkVolumeTexture* VolumeTexture;
289 
290  vtkImplicitFunction* NoiseGenerator;
291  int NoiseTextureSize[2];
292 
294  const vtkOpenGLGPUVolumeRayCastMapper&) = delete;
295  void operator=(const vtkOpenGLGPUVolumeRayCastMapper&) = delete;
296 };
297 
298 #endif // vtkOpenGLGPUVolumeRayCastMapper_h
abstract interface for implicit functions
virtual void GPURender(vtkRenderer *, vtkVolume *)
Handled in the subclass - the actual render method.
void ReleaseGraphicsResources(vtkWindow *) override
Release any graphics resources that are being consumed by this mapper.
represents a volume (data & properties) in a rendered scene
Definition: vtkVolume.h:50
std::map< const vtkShader::ReplacementSpec, vtkShader::ReplacementValue > UserShaderReplacements
vtkGenericOpenGLResourceFreeCallback * ResourceCallback
vtkTypeUInt32 vtkMTimeType
Definition: vtkType.h:300
Creates and manages the volume texture rendered by vtkOpenGLGPUVolumeRayCastMapper.
virtual void GetDepthImage(vtkImageData *)
Low level API to export the depth texture as vtkImageData in RenderToImage mode.
Type
Available shader types.
Definition: vtkShader.h:48
virtual void GetColorImage(vtkImageData *)
Low level API to export the color texture as vtkImageData in RenderToImage mode.
void PreRender(vtkRenderer *vtkNotUsed(ren), vtkVolume *vtkNotUsed(vol), double vtkNotUsed(datasetBounds)[6], double vtkNotUsed(scalarRange)[2], int vtkNotUsed(noOfComponents), unsigned int vtkNotUsed(numberOfLevels)) override
abstract specification for renderers
Definition: vtkRenderer.h:63
window superclass for vtkRenderWindow
Definition: vtkWindow.h:37
OpenGL subclass that draws the image to the screen.
a simple class to control print indentation
Definition: vtkIndent.h:39
topologically and geometrically regular array of data
Definition: vtkImageData.h:45
void RenderBlock(vtkRenderer *vtkNotUsed(ren), vtkVolume *vtkNotUsed(vol), unsigned int vtkNotUsed(level)) override
void PostRender(vtkRenderer *vtkNotUsed(ren), int vtkNotUsed(noOfComponents)) override
vtkGetStringMacro(ExtensionsString)
Returns a string listing all available extensions.
represents the common properties for rendering a volume.
abstracts an OpenGL texture object.
create a window for renderers to draw into
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...
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
OpenGL camera.
void GetReductionRatio(double *ratio) override
Ray casting performed on the GPU.
static vtkGPUVolumeRayCastMapper * New()
vtkNew< vtkInformation > LastRenderPassInfo
Caches the vtkOpenGLRenderPass::RenderPasses() information.
The ShaderProgram uses one or more Shader objects.