Skip to content

GitLab

  • Menu
Projects Groups Snippets
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • VTK VTK
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 738
    • Issues 738
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 202
    • Merge requests 202
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Monitor
    • Monitor
    • Incidents
  • Packages & Registries
    • Packages & Registries
    • Package Registry
    • Infrastructure Registry
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • VTK
  • VTKVTK
  • Issues
  • #15392

Closed
Open
Created Mar 23, 2015 by Kitware Robot@kwrobotOwner

Weird render bug with depth peeling and background texture

This issue was created automatically from an original Mantis Issue. Further discussion may take place here.


I have a very weird problem with the render window. It only occurs if:

  • vtkRenderer was set to display a background texture at least once since program start
  • The background texture has a transformation (e.g., scaling for repeat)
  • Depth peeling is enabled
  • At least one transparent actor is displayed.

I attached a minimal working example below. You can use any png file for texture.png. I used a 2x2 pixel PNG with (0,0) and (1,1) black and the other two white (checker board).

I have uploaded the output of the code: http://imgur.com/a/olUW2

  • The first image is the "expected" outcome, which I retrieved by disabling depth peeling ("renderer->SetUseDepthPeeling(1);" is commeted out)
  • The second image is the outcome after running the example below unchanged
  • The third image shows what happens if zooming is done. Basically, the scene is restricted to the left lower part.

It seems like the transformation of the texture is somehow also applied to the render window?

Any insights on this? (Im running vtk 6 on Windows 8.1. The problem also shows up on two other machines, both Macs with Parallels.

<--------------------------- Minimal example -----------------------------------------
#include <vtkActor.h>
#include <vtkConeSource.h>
#include <vtkNew.h>
#include <vtkPNGReader.h>
#include <vtkProperty.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSTLReader.h>
#include <vtkTexture.h>
#include <vtkTransform.h>

int main(int argc, char** argv)
{
  // Any texture will work. I use a 2 by 2 pixel checkerboard pattern
  vtkNew<vtkPNGReader> pngReader;
  pngReader->SetFileName("texture.png");
  pngReader->Update();

  // Setting up the texture
  // IMPORTANT: Without a transformation on the texture, the bug will not occur.
  // (You can turn of texture repeating, but I transform to have a repeating texture)
  vtkNew<vtkTexture> texture;
  texture->SetInputConnection(pngReader->GetOutputPort());
  texture->SetRepeat(true);

  vtkNew<vtkTransform> trans;
  trans->Scale(2.0, 3.0, 1.0);
  texture->SetTransform(trans.Get());

  // Adding a transparent cone. Any geometry will work.
  // IMPORTANT: If the geometry is not transparent, the bug will not occur
  vtkNew<vtkConeSource> coneSrc;
  vtkNew<vtkPolyDataMapper> coneMapper;
  coneMapper->SetInputConnection(coneSrc->GetOutputPort());
  vtkNew<vtkActor> coneActor;
  coneActor->SetMapper(coneMapper.Get());
  coneActor->GetProperty()->SetOpacity(0.5);

  // Create the renderer
  // IMPORTANT: If depth peeling is not enabled, the bug will not occur.
  vtkNew<vtkRenderer> renderer;
  renderer->SetUseDepthPeeling(1);
  renderer->TexturedBackgroundOn();
  renderer->SetBackgroundTexture(texture.Get());
  renderer->AddActor(coneActor.Get());

  // Create the render window
  // IMPORTANT: If AlphaBitPlanes is off, the bug will not occur. (But no depth peeling either).
  vtkNew<vtkRenderWindow> renderWindow;
  renderWindow->AlphaBitPlanesOn();
  renderWindow->AddRenderer(renderer.Get());

  // Create the interactor and start up
  vtkNew<vtkRenderWindowInteractor> renderInteract;
  renderInteract->SetRenderWindow(renderWindow.Get());
  renderWindow->Render();
  renderInteract->Start();

  return 0;
}
Assignee
Assign to
Time tracking