VTK
|
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: vtkOpenGLGPUVolumeRayCastMapper.h 00005 00006 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 00007 All rights reserved. 00008 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 00009 00010 This software is distributed WITHOUT ANY WARRANTY; without even 00011 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00012 PURPOSE. See the above copyright notice for more information. 00013 00014 =========================================================================*/ 00029 #ifndef __vtkOpenGLGPUVolumeRayCastMapper_h 00030 #define __vtkOpenGLGPUVolumeRayCastMapper_h 00031 00032 #include "vtkGPUVolumeRayCastMapper.h" 00033 00034 class vtkVolume; 00035 class vtkRenderer; 00036 class vtkOpenGLExtensionManager; 00037 class vtkMatrix4x4; 00038 class vtkUnsupportedRequiredExtensionsStringStream; // Pimpl 00039 class vtkMapDataArrayTextureId; // Pimpl 00040 class vtkMapMaskTextureId; // Pimpl 00041 class vtkPolyData; 00042 class vtkClipConvexPolyData; 00043 class vtkClipPolyData; 00044 class vtkTessellatedBoxSource; 00045 00046 class vtkOpacityTable; // internal class. 00047 class vtkRGBTable; // internal class. 00048 class vtkKWScalarField; // internal class. 00049 class vtkKWMask; // internal class. 00050 00051 class vtkOpacityTables; // Pimpl 00052 class vtkDensifyPolyData; 00053 class vtkStdString; 00054 00055 class VTK_VOLUMERENDERING_EXPORT vtkOpenGLGPUVolumeRayCastMapper : public vtkGPUVolumeRayCastMapper 00056 { 00057 public: 00058 static vtkOpenGLGPUVolumeRayCastMapper *New(); 00059 vtkTypeMacro(vtkOpenGLGPUVolumeRayCastMapper,vtkGPUVolumeRayCastMapper); 00060 virtual void PrintSelf(ostream& os, vtkIndent indent); 00061 00063 00067 virtual int IsRenderSupported(vtkRenderWindow *window, 00068 vtkVolumeProperty *property); 00070 00073 static const char *OpenGLErrorMessage(unsigned int errorCode); 00074 00077 static void PrintError(const char *headerMessage); 00078 00079 00080 00081 protected: 00082 vtkOpenGLGPUVolumeRayCastMapper(); 00083 ~vtkOpenGLGPUVolumeRayCastMapper(); 00084 00085 // The render method called by the superclass 00086 virtual void GPURender(vtkRenderer *ren, 00087 vtkVolume *vol); 00088 00089 // Methods called by the AMR Volume Mapper. 00090 virtual void PreRender(vtkRenderer *ren, 00091 vtkVolume *vol, 00092 double datasetBounds[6], 00093 double scalarRange[2], 00094 int numberOfScalarComponents, 00095 unsigned int numberOfLevels); 00096 00097 // \pre input is up-to-date 00098 virtual void RenderBlock(vtkRenderer *ren, 00099 vtkVolume *vol, 00100 unsigned int level); 00101 00102 virtual void PostRender(vtkRenderer *ren, 00103 int numberOfScalarComponents); 00104 00106 00110 int TestRequiredExtension(vtkOpenGLExtensionManager *extensions, 00111 const char *extensionName); 00113 00119 void LoadExtensions(vtkRenderWindow *window); 00120 00122 void CreateGLSLObjects(); 00123 00129 void CreateOpenGLObjects(); 00130 00132 void ReleaseGraphicsResources(vtkWindow *window); 00133 00139 int AllocateFrameBuffers(vtkRenderer *ren); 00140 00142 00159 int LoadScalarField(vtkImageData *input, 00160 vtkImageData *maskInput, 00161 int textureExtent[6], 00162 vtkVolume *volume); 00164 00166 00170 int UpdateColorTransferFunction(vtkVolume *vol, 00171 int numberOfScalarComponents); 00172 // Description: 00173 // Allocate memory and load opacity table on the GPU or 00174 // reload it if the transfer functions changed. 00175 // \pre vol_exists: vol!=0 00176 // \pre valid_numberOfScalarComponents: numberOfScalarComponents==1 || numberOfScalarComponents==4 00177 int UpdateOpacityTransferFunction(vtkVolume *vol, 00178 int numberOfScalarComponents, 00179 unsigned int level); 00181 00184 void SetupRender(vtkRenderer *ren, vtkVolume *vol); 00185 00187 00189 void ClipBoundingBox(vtkRenderer *ren, 00190 double worldBounds[6], 00191 vtkVolume *vol); 00193 00195 00198 int RenderClippedBoundingBox(int tcoordFlag, 00199 size_t currentBlock, 00200 size_t numberOfBlocks, 00201 vtkRenderWindow *renWin); 00203 00206 void CopyFBOToTexture(); 00207 00209 void CleanupRender(); 00210 00212 void RenderTextureToScreen(vtkRenderer *ren); 00213 00216 int PowerOfTwoGreaterOrEqual(int x); 00217 00219 void CheckFrameBufferStatus(); 00220 00223 vtkStdString BufferToString(int buffer); 00224 00226 void DisplayReadAndDrawBuffers(); 00227 00229 void DisplayFrameBufferAttachments(); 00230 00232 void DisplayFrameBufferAttachment(unsigned int uattachment); 00233 00235 00241 void BuildProgram(int parallelProjection, 00242 int raycastMethod, 00243 int shadeMethod, 00244 int componentMethod); 00246 00248 void GetLightingStatus(); 00249 00251 void CheckCompilation(unsigned int fragmentShader); 00252 00254 int CheckLinkage(unsigned int programShader); 00255 00257 void PrintUniformVariables(unsigned int programShader); 00258 00261 void ValidateProgram(); 00262 00272 void ComputeReductionFactor(double allocatedTime); 00273 00275 00276 void RenderWholeVolume(vtkRenderer *ren, 00277 vtkVolume *vol); 00279 00281 00282 void RenderRegions(vtkRenderer *ren, 00283 vtkVolume *vol); 00285 00286 // Return abort status (true==abort) 00287 int RenderSubVolume(vtkRenderer *ren, 00288 double bounds[6], 00289 vtkVolume *vol); 00290 00291 void LoadProjectionParameters(vtkRenderer *ren, 00292 vtkVolume *vol); 00293 00295 void ComputeNumberOfCroppingRegions(); 00296 00297 void GetTextureFormat(vtkImageData *input, 00298 unsigned int *internalFormat, 00299 unsigned int *format, 00300 unsigned int *type, 00301 int *componentSize); 00302 00303 bool TestLoadingScalar(unsigned int internalFormat, 00304 unsigned int format, 00305 unsigned int type, 00306 int textureSize[3], 00307 int componentSize); 00308 00309 void SlabsFromDatasetToIndex(double slabsDataSet[6], 00310 double slabsPoints[6]); 00311 00312 void SlabsFromIndexToDataset(double slabsPoints[6], 00313 double slabsDataSet[6]); 00314 00315 const char *GetEnabledString(unsigned char value); 00316 void GetOpenGLState(); 00317 00318 void DebugDisplayBox(vtkPolyData *box); 00319 00320 void UpdateNoiseTexture(); 00321 00323 00327 double ComputeMinimalSampleDistancePerPixel(vtkRenderer *renderer, 00328 vtkVolume *volume); 00330 00339 virtual void GetReductionRatio(double ratio[3]); 00340 00341 int NumberOfCroppingRegions; 00342 00343 // World coordinates of each corner of the dataset. 00344 double BoundingBox[8][3]; 00345 00346 // Used during the clipping process. 00347 vtkPolyData *PolyDataBoundingBox; 00348 vtkPlaneCollection *Planes; 00349 vtkPlane *NearPlane; 00350 00351 vtkClipConvexPolyData *Clip; 00352 vtkMatrix4x4 *InvVolumeMatrix; 00353 00354 vtkDensifyPolyData *Densify; 00355 00356 int OpenGLObjectsCreated; 00357 int NumberOfFrameBuffers; 00358 00359 unsigned int FrameBufferObject; 00360 unsigned int DepthRenderBufferObject; 00361 00362 // 3D scalar texture +1D color+1D opacity+2D grabbed depth buffer 00363 // +1 2D colorbuffer. 00364 unsigned int TextureObjects[5]; 00365 unsigned int FragmentMainShader; 00366 unsigned int FragmentProjectionShader; 00367 unsigned int FragmentTraceShader; 00368 unsigned int FragmentCroppingShader; 00369 unsigned int FragmentComponentShader; 00370 unsigned int FragmentShadeShader; 00371 unsigned int ProgramShader; 00372 // used in MIP Mode (2 needed for ping-pong technique) 00373 unsigned int MaxValueFrameBuffer; 00374 unsigned int MaxValueFrameBuffer2; 00375 int ReducedSize[2]; 00376 00377 vtkPolyData *ClippedBoundingBox; 00378 00379 int LastSize[2]; 00380 00381 double ReductionFactor; 00382 00383 // Supported extensions 00384 // List of unsupported required extensions. Pimpl. 00385 vtkUnsupportedRequiredExtensionsStringStream *UnsupportedRequiredExtensions; 00386 int LoadExtensionsSucceeded; 00387 00388 int Supports_GL_ARB_texture_float; 00389 int SupportsPixelBufferObjects; 00390 00391 vtkTimeStamp DataBufferTime; 00392 00393 // Matrices used in internal computation. As a member variable, 00394 // only one memory allocation is performed. 00395 vtkMatrix4x4 *TempMatrix[3]; 00396 00397 double TableRange[2]; 00398 00399 // Final string to send to the GPU as the fragment program source code. 00400 // char *FragmentCode; 00401 // int FragmentCodeCapacity; 00402 00403 int ErrorLine; 00404 int ErrorColumn; 00405 char *ErrorString; 00406 00407 // Store the last projection an raycast method in order to not rebuild 00408 // the fragment code at every call. 00409 int LastParallelProjection; 00410 int LastRayCastMethod; 00411 int LastCroppingMode; 00412 int LastComponent; 00413 int LastShade; 00414 00415 vtkImageData *SmallInput; 00416 vtkTimeStamp SmallInputBuildTime; 00417 00420 void BuildScaleBiasProgram(); 00421 00422 unsigned int ScaleBiasProgramShader; // GLuint 00423 int UFrameBufferTexture; // GLint 00424 int UScale; // GLint 00425 int UBias; // GLint 00426 00427 #if 0 00428 vtkIdType LoadedExtent[6]; 00429 double LoadedBounds[6]; 00430 vtkTimeStamp LoadedScalarTime; 00431 int LoadedCellFlag; // point data or cell data (or field data, not handled) ? 00432 #endif 00433 00434 unsigned int SavedFrameBuffer; // some offscreen mode use a framebuffer too. 00435 00436 vtkTessellatedBoxSource *BoxSource; 00437 00438 float *NoiseTexture; 00439 int NoiseTextureSize; // size of one dimension. 00440 unsigned int NoiseTextureId; // GLuint 00441 00442 bool IgnoreSampleDistancePerPixel; 00443 00444 vtkMapDataArrayTextureId *ScalarsTextures; // need a list for AMR mode. 00445 vtkMapMaskTextureId *MaskTextures; // need a list for AMR mode. 00446 00447 vtkRGBTable *RGBTable; 00448 vtkRGBTable *Mask1RGBTable; 00449 vtkRGBTable *Mask2RGBTable; 00450 00451 vtkOpacityTables *OpacityTables; 00452 00453 vtkKWScalarField *CurrentScalar; 00454 vtkKWMask *CurrentMask; 00455 00456 float ActualSampleDistance; 00457 00458 double LastProgressEventTime; // initial value is 0.0. Expressed in seconds. 00459 00460 bool PreserveOrientation; 00461 00462 private: 00463 vtkOpenGLGPUVolumeRayCastMapper(const vtkOpenGLGPUVolumeRayCastMapper&); // Not implemented. 00464 void operator=(const vtkOpenGLGPUVolumeRayCastMapper&); // Not implemented. 00465 }; 00466 00467 #endif