Many textured vtkFollower failure
When instanciating more than 32 textured vtkFollower, some errors are logged about too many textures being send to the GPU and final render is totally broken.
Replacing vtkFollower
by vtkActor
gives no errors and works fine even with 100+ textures.
Errors :
2021-10-18 16:55:26.100 ( 1.300s) [ EA38C780] vtkOpenGLState.cxx:1795 WARN| Hardware does not support the number of textures defined.
2021-10-18 16:55:26.100 ( 1.300s) [ EA38C780]vtkOpenGLPolyDataMapper:2648 ERR| vtkCompositeMapperHelper2 (0x55b142535840): failed after Render 1 OpenGL errors detected
0 : (1281) Invalid value
Program to reproduce :
#include <vtkCell.h>
#include <vtkIdList.h>
#include <vtkNew.h>
#include <vtkRTAnalyticSource.h>
#include <vtkStaticCellLocator.h>
#include <vtkPlaneSource.h>
#include <vtkActor.h>
#include <vtkFollower.h>
#include <vtkRenderer.h>
#include <vtkCompositePolyDataMapper.h>
#include <vtkCompositePolyDataMapper2.h>
#include <vtkRenderWindow.h>
#include <vtkNew.h>
#include <vtkJPEGReader.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkTexture.h>
#include <vector>
//////////////////////////
constexpr int LOOP = 6;
const std::vector<const char*> TEXTURES = {
// list of texture name ...
};
//////////////////////////
int main(int, char *[])
{
vtkNew<vtkRenderer> renderer;
const std::string prefix = "/home/timothee/Data/materials/textures/";
for (int i = 0; i < LOOP; ++i)
{
for(int j = 0; j < LOOP; ++j)
{
vtkNew<vtkPlaneSource> source;
source->SetCenter(i, j, 0);
source->Update();
const std::string filename = prefix + TEXTURES[(i + LOOP *j) % TEXTURES.size()];
vtkNew<vtkJPEGReader> reader;
reader->SetFileName(filename.c_str());
vtkNew<vtkTexture> texture;
texture->SetInputConnection(reader->GetOutputPort());
vtkNew<vtkCompositePolyDataMapper2> mapper;
mapper->SetInputConnection(source->GetOutputPort());
vtkNew<vtkFollower> actor;
actor->SetCamera(renderer->GetActiveCamera());
actor->SetMapper(mapper);
actor->SetTexture(texture);
renderer->AddActor(actor);
}
}
renderer->ResetCamera(-1, LOOP + 1, -1, LOOP + 1, -1, 1);
vtkNew<vtkRenderWindow> window;
window->AddRenderer(renderer);
window->SetWindowName("Follower test");
vtkNew<vtkRenderWindowInteractor> interactor;
interactor->SetRenderWindow(window);
window->Render();
interactor->Start();
return 0;
}