[vtkusers] vtkSmartVolumeMapper point centered data

Alister O Maguire aom at uoregon.edu
Wed May 17 14:39:01 EDT 2017


Sounds good. I tried exchanging the SmartVolumeMapper for the 
GPUVolumeRayCastMapper, but it seems to be producing the same results...



On 2017/05/17 11:10, Alvaro Sanchez wrote:
> Thanks for the code Alister, I can't see anything obvious that could
> be causing the issue.  I will try
> to reproduce it here, in the mean time, could you try something for
> me? Exchange
> vtkSmartVolumeMapper for vtkGPUVolumeRayCastMapper and see if that
> helps.
> 
> On Wed, May 17, 2017 at 1:37 PM, Alister O Maguire <aom at uoregon.edu>
> wrote:
> 
>> Hi Alvaro,
>> 
>> Thanks for the response. The original data set is a rectilinear grid
>> (which should contain cell and point data), but I'm creating a
>> vtkImageData object from the data within this grid, and this image
>> data is what I'm passing to the volume mapper. VTK should be built
>> with OpenGL2, so I don't believe that is an issue. Currently, I'm
>> just using the default render mode for the mapper. I've attached the
>> module that uses the mapper below.
>> 
>> 
> /*****************************************************************************
>> *
>> * Copyright (c) 2000 - 2017, Lawrence Livermore National Security,
>> LLC
>> * Produced at the Lawrence Livermore National Laboratory
>> * LLNL-CODE-442911
>> * All rights reserved.
>> *
>> * This file is  part of VisIt. For  details, see
>> https://visit.llnl.gov/.  The
>> * full copyright notice is contained in the file COPYRIGHT located
>> at the root
>> * of the VisIt distribution or at
>> http://www.llnl.gov/visit/copyright.html [1].
>> *
>> * Redistribution  and  use  in  source  and  binary  forms,  with
>> or  without
>> * modification, are permitted provided that the following conditions
>> are met:
>> *
>> *  - Redistributions of  source code must  retain the above
>> copyright notice,
>> *    this list of conditions and the disclaimer below.
>> *  - Redistributions in binary form must reproduce the above
>> copyright notice,
>> *    this  list of  conditions  and  the  disclaimer (as noted
>> below)  in  the
>> *    documentation and/or other materials provided with the
>> distribution.
>> *  - Neither the name of  the LLNS/LLNL nor the names of  its
>> contributors may
>> *    be used to endorse or promote products derived from this
>> software without
>> *    specific prior written permission.
>> *
>> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT  HOLDERS AND
>> CONTRIBUTORS "AS IS"
>> * AND ANY EXPRESS OR  IMPLIED WARRANTIES, INCLUDING,  BUT NOT
>> LIMITED TO, THE
>> * IMPLIED WARRANTIES OF MERCHANTABILITY AND  FITNESS FOR A
>> PARTICULAR  PURPOSE
>> * ARE  DISCLAIMED. IN  NO EVENT  SHALL LAWRENCE  LIVERMORE NATIONAL
>> SECURITY,
>> * LLC, THE  U.S.  DEPARTMENT OF  ENERGY  OR  CONTRIBUTORS BE  LIABLE
>> FOR  ANY
>> * DIRECT,  INDIRECT,   INCIDENTAL,   SPECIAL,   EXEMPLARY,  OR
>> CONSEQUENTIAL
>> * DAMAGES (INCLUDING, BUT NOT  LIMITED TO, PROCUREMENT OF
>> SUBSTITUTE GOODS OR
>> * SERVICES; LOSS OF  USE, DATA, OR PROFITS; OR  BUSINESS
>> INTERRUPTION) HOWEVER
>> * CAUSED  AND  ON  ANY  THEORY  OF  LIABILITY,  WHETHER  IN
>> CONTRACT,  STRICT
>> * LIABILITY, OR TORT  (INCLUDING NEGLIGENCE OR OTHERWISE)  ARISING
>> IN ANY  WAY
>> * OUT OF THE  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
>> POSSIBILITY OF SUCH
>> * DAMAGE.
>> *
>> 
> *****************************************************************************/
>> 
>> //
>> 
> *************************************************************************
>> //
>> //                           avtDefaultRenderer.C
>> //
>> //
>> 
> *************************************************************************
>> //
>> 
>> #include <vtkAutoInit.h>
>> VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
>> 
>> #include "avtDefaultRenderer.h"
>> #include <avtOpenGLExtensionManager.h>
>> 
>> #include <vtkRectilinearGrid.h>
>> #include <vtkUnstructuredGrid.h>
>> #include <vtkRenderer.h>
>> 
>> #include <VolumeAttributes.h>
>> #include <avtCallback.h>
>> #include <DebugStream.h>
>> 
>> #include <vtkColorTransferFunction.h>
>> #include <vtkVolumeProperty.h>
>> #include <vtkImageData.h>
>> #include <vtkPiecewiseFunction.h>
>> #include <LightList.h>
>> 
>> //
>> 
> ****************************************************************************
>> //  Method: avtDefaultRenderer::avtDefaultRenderer
>> //
>> //  Purpose:
>> //    Initialize the memebers associated with the default renderer.
>> //
>> //  Programmer:  Alister Maguire
>> //  Creation:    April 3, 2017
>> //
>> //  Modifications:
>> //
>> //
>> 
> ****************************************************************************
>> 
>> avtDefaultRenderer::avtDefaultRenderer()
>> {
>> VTKRen        = NULL;
>> lastVolume    = NULL;
>> gridToRender  = NULL;
>> resetColorMap = false;
>> volumeProp    = vtkSmartPointer<vtkVolumeProperty>::New();
>> mapper        = vtkSmartPointer<vtkSmartVolumeMapper>::New();
>> }
>> 
>> //
>> 
> ****************************************************************************
>> //  Method: avtDefaultRenderer::~avtDefaultRenderer
>> //
>> //  Purpose:
>> //    Destructor.
>> //
>> //  Programmer:  Alister Maguire
>> //  Creation:    April 3, 2017
>> //
>> //  Modifications:
>> //
>> //
>> 
> ****************************************************************************
>> 
>> avtDefaultRenderer::~avtDefaultRenderer()
>> {
>> }
>> 
>> //
>> 
> ****************************************************************************
>> //  Method:  avtDefaultRenderer::Render
>> //
>> //  Purpose:
>> //    Render a volume using a vtkSmartVolumeMapper
>> //
>> //  Arguments:
>> //    props   : the rendering properties
>> //    volume  : the volume to be rendered
>> //
>> //  Programmer:  Alister Maguire
>> //  Creation:    April 3, 2017
>> //
>> //  Modifications:
>> //
>> //
>> 
> ****************************************************************************
>> 
>> void
>> avtDefaultRenderer::Render(
>> const avtVolumeRendererImplementation::RenderProperties &props,
>> const avtVolumeRendererImplementation::VolumeData &volume)
>> {
>> if (props.dataIs2D)
>> return;
>> 
>> bool needsReset   = false;
>> const char *mName = "avtDefaultRenderer::Render ";
>> 
>> //Add volume data to mapper
>> //Need to convert it from RectilinearGrid to ImageData
>> if(gridToRender == NULL)
>> {
>> debug5 << mName << "Converting from rectilinear grid to
>> image data" << endl;
>> 
>> int dims[3], extent[6];
>> ((vtkRectilinearGrid *)volume.grid)->GetDimensions(dims);
>> ((vtkRectilinearGrid *)volume.grid)->GetExtent(extent);
>> vtkDataArray *da = ((vtkRectilinearGrid
>> *)volume.grid)->GetPointData()->GetScalars();
>> 
>> vtkRectilinearGrid *rgrid = (vtkRectilinearGrid *)
>> volume.grid;
>> double spacingX = rgrid->GetXCoordinates()->GetTuple1(1)-
>> rgrid->GetXCoordinates()->GetTuple1(0);
>> double spacingY = rgrid->GetYCoordinates()->GetTuple1(1)-
>> rgrid->GetYCoordinates()->GetTuple1(0);
>> double spacingZ = rgrid->GetZCoordinates()->GetTuple1(1)-
>> rgrid->GetZCoordinates()->GetTuple1(0);
>> 
>> gridToRender = vtkSmartPointer<vtkImageData>::New();
>> gridToRender->SetDimensions(dims);
>> gridToRender->SetExtent(extent);
>> gridToRender->SetSpacing(spacingX, spacingY, spacingZ);
>> gridToRender->AllocateScalars(VTK_FLOAT, 1);
>> int limit = dims[0] * dims[1] * dims[2];
>> float *p  = (float *)gridToRender->GetScalarPointer();
>> 
>> //Set the origin to match the lower bounds of the grid
>> double bounds[6];
>> ((vtkRectilinearGrid *)volume.grid)->GetBounds(bounds);
>> gridToRender->SetOrigin(bounds[0], bounds[2], bounds[4]);
>> 
>> for (int i = 0 ; i < limit ; i++)
>> {
>> // z-axis is reversed somehow
>> p[i] = da->GetTuple1(i);
>> }
>> 
>> debug5 << mName << "Adding data to the mapper" << endl;
>> 
>> mapper->SetInputData(gridToRender);
>> mapper->SetScalarModeToUsePointData();
>> mapper->SetBlendModeToComposite();
>> resetColorMap = true;
>> needsReset    = true;
>> }
>> 
>> if(resetColorMap || oldAtts != props.atts)
>> {
>> 
>> debug5 << mName << "Resetting color" << endl;
>> 
>> //getting color/alpha transfer function from VisIt
>> unsigned char rgba[256*4];
>> props.atts.GetTransferFunction(rgba);
>> float min = volume.data.min;
>> float max = volume.data.max;
>> float range = max - min;
>> vtkColorTransferFunction *trans_func =
>> vtkColorTransferFunction::New();
>> vtkPiecewiseFunction *opacity = vtkPiecewiseFunction::New();
>> for(int i = 0; i < 256; i++) {
>> float pos = min + (i/255.f)*range;
>> trans_func->AddRGBPoint(pos, rgba[4*i]/255.f,
>> rgba[4*i+1]/255.f, rgba[4*i+2]/255.f);
>> opacity->AddPoint(pos, rgba[i*4+3]/255.f);
>> }
>> 
>> volumeProp->SetColor(trans_func);
>> volumeProp->SetScalarOpacity(opacity);
>> 
>> resetColorMap = false;
>> needsReset    = true;
>> }
>> 
>> debug5 << mName << "Rendering!" << endl;
>> 
>> //Create the volume to be rendered and
>> //set its mapper to our SmartVolumeMapper.
>> if (lastVolume == NULL || needsReset)
>> {
>> if (lastVolume != NULL)
>> lastVolume->Delete();
>> lastVolume = vtkSmartPointer<vtkVolume>::New();
>> lastVolume->SetMapper(mapper);
>> lastVolume->SetProperty(volumeProp);
>> }
>> 
>> mapper->Render(VTKRen, lastVolume);
>> }
>> 
>> On 2017/05/17 09:14, Alvaro Sanchez wrote:
>> Hi,
>> I assume your dataset contains both cell and point data.  Did you
>> build VTK with OpenGL2?
>> Are you using any particular configuration in vtkSmartVolumeMapper
>> (GPURenderMode,
>> VectorMode, etc.)?
>> 
>> It would be nice If you could provide some sample code.
>> 
>> On Sun, May 14, 2017 at 11:01 PM, Alister O Maguire
>> <aom at uoregon.edu>
>> wrote:
>> 
>> Hello,
>> 
>> I'm using the vtkSmartVolumeMapper for volume rendering, but it
>> appears to only be rendering as cell-centered data (you can clearly
>> see the cell boundaries). I'm calling SetScalarModeToUsePointData(),
>> but this doesn't seem to be having any affect. It actually looks the
>> same as when I call SetScalarModeToUseCellData(). Any ideas on how
>> to get this mapper to use point centered data when rendering?
>> 
>> Best,
>> Alister
>> _______________________________________________
>> Powered by www.kitware.com [2] [1]
>> 
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html [3] [2]
>> 
>> Please keep messages on-topic and check the VTK FAQ at:
>> http://www.vtk.org/Wiki/VTK_FAQ [4] [3]
>> 
>> Search the list archives at: http://markmail.org/search/?q=vtkusers
>> [5]
>> [4]
>> 
>> Follow this link to subscribe/unsubscribe:
>> http://public.kitware.com/mailman/listinfo/vtkusers [6] [5]
>> 
>> --
>> 
>> Alvaro Sanchez
>> Kitware, Inc.
>> Senior R&D Engineer
>> 21 Corporate Drive
>> Clifton Park, NY 12065-8662
>> Phone: 518-881-4901 [7]
>> 
>> Links:
>> ------
>> [1] http://www.kitware.com
>> [2] http://www.kitware.com/opensource/opensource.html [3]
>> [3] http://www.vtk.org/Wiki/VTK_FAQ [4]
>> [4] http://markmail.org/search/?q=vtkusers [5]
>> [5] http://public.kitware.com/mailman/listinfo/vtkusers [6]
> 
> --
> 
> Alvaro Sanchez
> Kitware, Inc.
> Senior R&D Engineer
> 21 Corporate Drive
> Clifton Park, NY 12065-8662
> Phone: 518-881-4901
> 
> Links:
> ------
> [1] http://www.llnl.gov/visit/copyright.html
> [2] http://www.kitware.com
> [3] http://www.kitware.com/opensource/opensource.html
> [4] http://www.vtk.org/Wiki/VTK_FAQ
> [5] http://markmail.org/search/?q=vtkusers
> [6] http://public.kitware.com/mailman/listinfo/vtkusers
> [7] tel:518-881-4901


More information about the vtkusers mailing list