Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
0.8.4:volumerendering [2022/05/05 12:38] – [Gamut Mapping] admin0.8.4:volumerendering [2022/06/16 13:46] – [Lighting] admin
Line 262: Line 262:
   FFrontFaceRenderPass.FaceKind := TFaceKind.FrontFace;   FFrontFaceRenderPass.FaceKind := TFaceKind.FrontFace;
   FFrontFaceRenderPass.Viewport := GorillaViewport1;   FFrontFaceRenderPass.Viewport := GorillaViewport1;
-  FFrontFaceRenderPass.Enabled := true; 
  
   // a pre render-pass to get all vertex positions of back faces   // a pre render-pass to get all vertex positions of back faces
Line 268: Line 267:
   FBackFaceRenderPass.FaceKind := TFaceKind.BackFace;   FBackFaceRenderPass.FaceKind := TFaceKind.BackFace;
   FBackFaceRenderPass.Viewport := GorillaViewport1;   FBackFaceRenderPass.Viewport := GorillaViewport1;
-  FBackFaceRenderPass.Enabled := true; 
  
   // create the volume mesh   // create the volume mesh
Line 277: Line 275:
   FVolume.FrontFaceRenderPass := FFrontFaceRenderPass;   FVolume.FrontFaceRenderPass := FFrontFaceRenderPass;
   FVolume.BackFaceRenderPass  := FBackFaceRenderPass;   FVolume.BackFaceRenderPass  := FBackFaceRenderPass;
 +  
 +  // only the volume itself should be rendered for front/back face detected
 +  // this will ignore all other objects.
 +  FFrontFaceRenderPass.AllowControl(FVolume);  
 +  FFrontFaceRenderPass.Enabled := true;
 +  FBackFaceRenderPass.AllowControl(FVolume);  
 +  FBackFaceRenderPass.Enabled := true;  
      
   // configure some settings   // configure some settings
Line 353: Line 358:
 |Gamut|Texture used for mapping the 3D value during Raytracing| |Gamut|Texture used for mapping the 3D value during Raytracing|
 |GamutMode|Defines when and how the value-color mapping happens. Here different modes are available: GamutNone, GamutByValue, GamutByValueMultiply, GamutBySum, GamutBySumMultiply| |GamutMode|Defines when and how the value-color mapping happens. Here different modes are available: GamutNone, GamutByValue, GamutByValueMultiply, GamutBySum, GamutBySumMultiply|
-|GamutFactor|A factor applied to the absolute 3D value before mapping onto the gamut texture (default value is 1.0)|+|GamutFactor|A factor applied to the absolute 3D value before mapping onto the gamut texture (default value is 1.0). Use this value for shifting inside of the gamut texture. | 
 +|GamutIntensity|Defines how intense coloring is.| 
 +|GamutAlphaIntensity|Defines how intense alpha channel coloring is.|
  
-{{youtube>cmgTMz4PDAc?large }}+{{youtube>cmgTMz4PDAc?large}}
  
  
Line 368: Line 375:
 |GamutBySum|Gamut mapping will be applied to the final casted ray value.| |GamutBySum|Gamut mapping will be applied to the final casted ray value.|
 |GamutBySumMultiply|Gamut mapping will be applied to the final casted ray value and afterwards multiplied with the previously computed color value.| |GamutBySumMultiply|Gamut mapping will be applied to the final casted ray value and afterwards multiplied with the previously computed color value.|
 +
 +===== Lighting =====
 +
 +Since v0.8.4.2314 lighting and iso surface detection is also supported.
 +
 +To activate lighting for a volumetric mesh, please use:
 +<file pascal>
 +GorillaVolumetricMesh1.UseLighting := true;
 +</file>
 +
 +After it was activated, the implemented functions try to detect a surface from the given 3D data.
 +This is called IsoSurface detection.
 +
 +Because this method always depends on the data, you can control this detection by **IsoSurfaceLimit** property.
 +
 +{{:0.8.4:vr_isosurf.jpg?nolink&600|}}
 +
 +<file pascal>
 +GorillaVolumetricMesh1.IsoSurfaceLimit := 0.125;
 +</file>
 +
 +When detection of a volume surface was successful, we are able to apply lighting with all available shading models to it.
 +
 +The volumetric mesh therefore allows to choose between: Lambert, Phong, Blinn-Phong and PBR.
 +
 +{{:0.8.4:vr_lighting.jpg?nolink&600|}}
 +
 +<file pascal>
 +GorillaVolumetricMesh1.ShadingModel := TGorillaShadingModel.smPBR;
 +</file>
 +
 +__Notice:__ For PBR (physically based rendering) it does not need any PBR texture, instead it will use the //AOBias//, //RoughnessBias// and //MetallicBias// properties.
 +
 +
 +{{youtube>zMfiPLPDcq0?large}}
 +
 +===== Filtering and MipMaps =====
 +
 +Since v0.8.4.2314 switching between nearest and linear filtering is supported.
 +You are also able to activate MipMaps, but in most test cases the result was unsatisfying.
 +
 +{{:0.8.4:vr_filtering.jpg?nolink&600|}}
 +
 +The picture above is showing difference between nearest (left) and linear (right) filtering.
 +In most cases linear filtering is the expected output, but for some customers exact display of 3D data values is necessary.
 +
 +<file pascal>
 +GorillaVolumetricMesh1.LinearFiltering := true;
 +GorillaVolumetricMesh1.MipMaps := true;
 +</file>
 +
 +
  
 ===== Multiple VolumetricMeshes / Complex Scenes ===== ===== Multiple VolumetricMeshes / Complex Scenes =====
Line 391: Line 450:
  
 // exclude all other volumetric meshes or other objects - that the render pass only renders the relevant volume // exclude all other volumetric meshes or other objects - that the render pass only renders the relevant volume
-FFrontFaceRenderPass1.IgnoreControl(FVolume2); // !!! only compute Volume #1+FFrontFaceRenderPass1.AllowControl(FVolume1); // !!! only compute Volume #1
 FFrontFaceRenderPass1.Enabled := true; FFrontFaceRenderPass1.Enabled := true;
    
Line 399: Line 458:
  
 // exclude all other volumetric meshes or other objects - that the render pass only renders the relevant volume // exclude all other volumetric meshes or other objects - that the render pass only renders the relevant volume
-FBackFaceRenderPass1.IgnoreControl(FVolume2); // !!! only compute Volume #1+FBackFaceRenderPass1.AllowControl(FVolume1); // !!! only compute Volume #1
 FBackFaceRenderPass1.Enabled := true; FBackFaceRenderPass1.Enabled := true;
  
Line 412: Line 471:
  
 // exclude all other volumetric meshes or other objects - that the render pass only renders the relevant volume // exclude all other volumetric meshes or other objects - that the render pass only renders the relevant volume
-FFrontFaceRenderPass2.IgnoreControl(FVolume1); // !!! only compute Volume #2+FFrontFaceRenderPass2.AllowControl(FVolume2); // !!! only compute Volume #2
 FFrontFaceRenderPass2.Enabled := true; FFrontFaceRenderPass2.Enabled := true;
    
Line 421: Line 480:
  
 // exclude all other volumetric meshes or other objects - that the render pass only renders the relevant volume // exclude all other volumetric meshes or other objects - that the render pass only renders the relevant volume
-FBackFaceRenderPass2.IgnoreControl(FVolume1); // !!! only compute Volume #2+FBackFaceRenderPass2.AllowControl(FVolume2); // !!! only compute Volume #2
 FBackFaceRenderPass2.Enabled := true; FBackFaceRenderPass2.Enabled := true;