Hi there,
My team has been trying to replace the filter vtkGlyph3D by its GPU version vtkGlyph3DMapper, but seems like the mapper version does not support large coordinates very well as the filter do. Since in our project the point coordinates are frequently above 6000000, I would like to know if we are missing any additional configuration; if its a limitation of this mapper or a mere lack of understanding. Thank you!
(I suspect this topic from @cobo might be related: Struggling with geographic coordinates, but I’m not sure how that could apply for mappers)
Follow a simple code example comparing the two approaches given the same input data:

Glyph3dMapper vs Glyph3d
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkCubeSource.h>
#include <vtkFloatArray.h>
#include <vtkGlyph3DMapper.h>
#include <vtkNamedColors.h>
#include <vtkPointData.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkUnsignedCharArray.h>
int main(int, char*[]) {
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
points->SetDataTypeToDouble();
points->InsertNextPoint(6000000, 6000000, 6000000);
points->InsertNextPoint(6000001, 6000001, 6000001);
points->InsertNextPoint(6000002, 6000002, 6000002);
vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
polydata->SetPoints(points);
vtkSmartPointer<vtkCubeSource> cubeSource = vtkSmartPointer<vtkCubeSource>::New();
// ### Glyph3d
vtkSmartPointer<vtkGlyph3D> glyph3D = vtkSmartPointer<vtkGlyph3D>::New();
glyph3D->SetSourceConnection(cubeSource->GetOutputPort());
glyph3D->SetInputData(polydata);
glyph3D->Update();
vtkSmartPointer<vtkPolyDataMapper> glyph_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
glyph_mapper->SetInputConnection(glyph3D->GetOutputPort());
vtkSmartPointer<vtkActor> actor_glyph = vtkSmartPointer<vtkActor>::New();
actor_glyph->SetMapper(glyph_mapper);
// ### Glyph3dMapper
vtkSmartPointer<vtkGlyph3DMapper> glyph3Dmapper = vtkSmartPointer<vtkGlyph3DMapper>::New();
glyph3Dmapper->SetSourceConnection(cubeSource->GetOutputPort());
glyph3Dmapper->SetInputData(polydata);
glyph3Dmapper->Update();
vtkSmartPointer<vtkActor> actor_glyph_3dmapper = vtkSmartPointer<vtkActor>::New();
actor_glyph_3dmapper->SetMapper(glyph3Dmapper);
// Create a renderer, render window, and interactor
// Define viewport ranges
// (xmin, ymin, xmax, ymax)
double leftViewport[4] = {0.0, 0.0, 0.5, 1.0};
double rightViewport[4] = {0.5, 0.0, 1.0, 1.0};
// Setup both renderers
vtkSmartPointer<vtkRenderer> leftRenderer = vtkSmartPointer<vtkRenderer>::New();
leftRenderer->SetViewport(leftViewport);
leftRenderer->SetBackground(.6, .5, .4);
vtkSmartPointer<vtkRenderer> rightRenderer = vtkSmartPointer<vtkRenderer>::New();
rightRenderer->SetViewport(rightViewport);
rightRenderer->SetBackground(.4, .5, .6);
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(leftRenderer);
renderWindow->AddRenderer(rightRenderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
// Add the actor to the scene
leftRenderer->AddActor(actor_glyph_3dmapper);
rightRenderer->AddActor(actor_glyph);
// Position the camera
leftRenderer->GetActiveCamera()->SetPosition(5999990, 6000000, 6000000);
leftRenderer->GetActiveCamera()->SetFocalPoint(6000000, 6000000, 6000000);
rightRenderer->GetActiveCamera()->SetPosition(5999990, 6000000, 6000000);
rightRenderer->GetActiveCamera()->SetFocalPoint(6000000, 6000000, 6000000);
// Render and interact
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
Thank you for your time,
Rodrigo Figueiredo.