I want to display two polygon in one renderer. And the result is:
The green and red color indicates two polygons.
However, when I rotate it, some part of green color disappear:
My environment is:
I can 100% reproduce this phenomenon, and the code to reproduce my problem is:
import vtkmodules.all as vtk
polydata = vtk.vtkPolyData()
vps = vtk.vtkPoints()
polygon = vtk.vtkPolygon()
for i in range(len(points)):
vps.InsertNextPoint(points[i], points[i], points[i])
polygons = vtk.vtkCellArray()
polydata1 = buildPolygon([
[0, 0, 0],
[10, 0, 0],
[10, 10, 0],
[0, 10, 0]
map1 = vtk.vtkPolyDataMapper()
actor1 = vtk.vtkActor()
actor1.GetProperty().SetColor(1, 0, 0)
polydata2 = buildPolygon([
[0, 0, 0],
[5, 0, 0],
[5, 5, 0],
[0, 5, 0]
map2 = vtk.vtkPolyDataMapper()
actor2 = vtk.vtkActor()
actor2.GetProperty().SetColor(0, 1, 0)
render = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
iren = vtk.vtkRenderWindowInteractor()
That is called z-fighting. It happens in graphics when polygons overlap and have exactly coincident planes. In your case both polygons are on the z=0 plane thus there is no “right” way for openGL to decide which is in front of the other and the color of the pixels are thus indeterminant.
@Dave_DeMarle Thanks for kindly reply, and I can understand the reason of this bug.
But, if I want to show two polygons, how can I correctly visualize it? Can I manually set the render order for the two polygons?
Try using vtkMapper::SetResolveCoincidentTopologyToPolygonOffset()
There are several VTK tests (both Python and C++) that use these methods. Make sure they are passing for you (AFAIK the VTK testing dashboards are green relative to these tests). If not, let us know. Otherwise see why they work and what you are doing does not work.
I find only one example using this method. Could you please recommand some other examples?
tests as in VTK///Testing/Python/.py and VTK///Testing/Cxx/.cxx. It’s easiest to build VTK with testing enabled to run these tests.
@will.schroeder Thanks for your suggestion, and I have fixed this bug by:
SetRelativeCoincidentTopologyPolygonOffsetParameters method has two parameters:
double factor, double units, how to understand this
map2.SetResolveCoincidentTopologyPolygonOffsetParameters(0, 60000), I don’t know why
0, 60000 works. Actually,
0, 6000 don’t work, and
1, 60000 work. I don’t know how does this
units affect the visualization result.
Could you please give some explanation about this two parameters? Or could you please recommand some information to understand these two parameters?
See documentation here: glPolygonOffset - OpenGL 4 Reference Pages