// This turns on resolve coincident topology for everything
  // as it is a class static on the mapper
  vtkPolyDataMapper::SetResolveCoincidentTopologyToPolygonOffset();

  if (this->AlwaysOnTop)
  {
    // max value 65536 so we subtract 66000 to make sure we are
    // zero or negative
    this->LinesMapper->SetRelativeCoincidentTopologyLineOffsetParameters(0, -66000);
    this->LinesMapper->SetRelativeCoincidentTopologyPolygonOffsetParameters(0, -66000);
    this->LinesMapper->SetRelativeCoincidentTopologyPointOffsetParameter(-66000);
    this->Mapper->SetRelativeCoincidentTopologyLineOffsetParameters(0, -66000);
    this->Mapper->SetRelativeCoincidentTopologyPolygonOffsetParameters(0, -66000);
    this->Mapper->SetRelativeCoincidentTopologyPointOffsetParameter(-66000);
    this->ActiveMapper->SetRelativeCoincidentTopologyLineOffsetParameters(0, -66000);
    this->ActiveMapper->SetRelativeCoincidentTopologyPolygonOffsetParameters(0, -66000);
    this->ActiveMapper->SetRelativeCoincidentTopologyPointOffsetParameter(-66000);
  }
  else
  {
    this->LinesMapper->SetRelativeCoincidentTopologyLineOffsetParameters(-1, -1);
    this->LinesMapper->SetRelativeCoincidentTopologyPolygonOffsetParameters(-1, -1);
    this->LinesMapper->SetRelativeCoincidentTopologyPointOffsetParameter(-1);
    this->Mapper->SetRelativeCoincidentTopologyLineOffsetParameters(-1, -1);
    this->Mapper->SetRelativeCoincidentTopologyPolygonOffsetParameters(-1, -1);
    this->Mapper->SetRelativeCoincidentTopologyPointOffsetParameter(-1);
    this->ActiveMapper->SetRelativeCoincidentTopologyLineOffsetParameters(-1, -1);
    this->ActiveMapper->SetRelativeCoincidentTopologyPolygonOffsetParameters(-1, -1);
    this->ActiveMapper->SetRelativeCoincidentTopologyPointOffsetParameter(-1);
  }

也可以采用更改z深度方式

mapper->AddShaderReplacement(vtkShader::Fragment, "//VTK::Depth::Impl", true,
							 "gl_FragDepth = gl_FragCoord.z * 0.01;\n", true);

也可以关闭深度测试 

 // 深度禁用
    bool DepthTest;
    if( vtkGenericOpenGLRenderWindow::SafeDownCast( Renderer->GetRenderWindow() ) )
    {
        DepthTest = vtkGenericOpenGLRenderWindow::SafeDownCast( Renderer->GetRenderWindow() )->GetState()->GetEnumState( GL_DEPTH_TEST );
        vtkGenericOpenGLRenderWindow::SafeDownCast( Renderer->GetRenderWindow() )->GetState()->SetEnumState( GL_DEPTH_TEST, false );
    }

    std::vector<vtkSmartPointer<vtkProp>> vecActor = m_Handle->GetRenderActor(3);
    for( auto item : vecActor )
    {
        count += item->RenderOverlay( v );
        vtkActor::SafeDownCast( item )->GetProperty()->SetRepresentationToSurface();
    }

    // 深度恢复启用
    if( vtkGenericOpenGLRenderWindow::SafeDownCast( Renderer->GetRenderWindow() ) )
    {
        vtkGenericOpenGLRenderWindow::SafeDownCast( Renderer->GetRenderWindow() )->GetState()->SetEnumState( GL_DEPTH_TEST, DepthTest );
    }

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐