vtk 中vtkMapper的各函数解析

它是一个抽象类,用来指定接口去映射数据到图形初级单元上。子类通过一个lookuptable来映射数据,并且控制渲染初级单元(图形库的接口)的建立。这种映射能够通过控制提供的lookup table和指定映射数据的scalar(标量)的范围来控制。这之中有一些重要的控制机制来影响这个类的一些常量。ScalarVisibility flag控制标量数据是否控制Mapper相关actors的颜色。ScalarMode ivar 用来控制是标量数据还是单元数据用来控制对象的颜色。通常情况下,点数据的标量只有在单元标量不存在时才会被用,或者你也可以控制是用点数据还是单元数据,最后,通过lookup table 来控制标量的映射是通过设置ColorMode flag来实现的。相关请看文档。

这个类的另外一个特征就是是否使用即时渲染(ImmediateModeRenderingOn)或者显示系列渲染(就是一次渲染多副)(ImmediateModeRenderingOff)如果采用display lists,一个数据结构就会被建立(大致在渲染库里),它能够快速遍历并且通过渲染库渲染。display lists的劣势在于它会需要更多的内存,因此会影响系统的运行质量。

还有一个重要的特征就是改变z-buffer去保存一致拓扑。例如,如果你要画一个有不同颜色边的网格,这个特征能够得到好的可视化线。

#ifndef __vtkMapper__h 这是 //if not defined的简写是宏定义的一种,它是可以根据是否已经定义了一个变量来进行分支选择

没定义就定义__vtkMapper__h

分别导入vtkRenderingCoreModule.h//用来导入宏。父类vtkAbstractMapper3D.h,vtkScalarsToColors.h用来VTK_COLOR_MODE_DEFAULT和_MAP_SCALARS的使用

public:

1.通过vtkTypeMacro宏定义vtkMapper的父类是vtkAbstractMapper3D。

2.定义PrintSelf函数

3.定义浅复制函数ShallowCopy(vtkAbstractMapper *m);

4.重载标准的时间修改方法。如果lookup table被修改,这个对象也要被修改。unsigned long GetMTime();//获得修改时间

5.方法初始化mapping进程。整体由actor传输并且每一个frame都被渲染。 virtual void Render(vtkRenderer *ren, vtkActor *a)=0;

6.释放任何由这个mapper产生的图形源。元素window可以用来决定释放哪个图形源 virtual void ReleaseGraphicsResources(vtkWindow *)

7.指定一个lookup table 给mapper使用。void SetLookupTable(vtkScalarsToColors *lut);vtkScalarsToColors *GetLookupTable();

8.创建默认的lookup table。普遍用来创建一个lookup table当scalar data没有可用的时候。

9.通过turn on/off标记控制mapper的数据是否是静态的。静态数据意味着mapper不传递更新到流水线中,极大减少它用来更新mapper的时间。这只用在数据永远不改变的情况下。vtkSetMacro(Static,int);vtkGetMacro(Static,int);vtkBooleanMacro(Static,int);

10.控制标量数据如何映射到颜色上。默认情况下(ColorModeToDefault),usigned char 标量数据被用来作为颜色,并且不通过lookup table来映射,但是其他所有东西都是通过lookup table的。设置ColorModeToMapScalars意味着所有的标量数据将会通过lookup table来映射(对于多组件的标量数据,特一组件用来映射的可以由SelectColorArray()方法指定。)vtkSetMacro(ColorMode,int);vtkGetMacro(ColorMode,int);还有两个函数用来设置ColorMode为以上的两个类型之一

11.返回用来作为颜色的标量数据:const  char *GetColorModeAsString();

12.默认情况下,顶点的颜色被用来映射整个面的颜色。映射后,颜色将会被自动通过插值运算插入。这个选项避免颜色插入通过使用一维的纹理来映射颜色。set,get,Boolean  InterpolateScalarsBeforeMapping。

13.控制mapper是否通过他的自己的标量范围来设置lookuptable的范围。或者,他要用lookuptable的范围来代理它本身的范围设置。默认情况下,mapper是允许设置Lookuptable的范围的,但是用户在mappers和actors共享Lookuptable时会希望强制使mapper使用指定的Lookuptable而不变。set,get,Boolean UseLookupTableScalarRange

14.通过制定标量的最大值和最小值来设置其范围。这些值用来映射标量到lookup table中。当UseLookupTableScalarRange时true时无用。vtkSetVector2Macro(ScalarRange,doubles)。get

15.控制是否使用即时渲染。即时渲染很慢,但是他可以操控大数据,默认是关掉即时渲染的。如果在渲染大数据时有问题,可能要打开即时渲染。set,get,Boolean ImmediateModeRendering。

16.全局设置GlobalImmediateModeRendering,效果同上。此时为静态变量,设置之后成为全局静态变量

17.强制编译,当ImmediateModeRendering为false时,模式变为display lists,如果ImmediateModeRendering是true则没有任何渲染发生,改变改flag的值不会改变,mapper的修改时间。初始value是false,这个方法能够被其他的也是用diaplay lists的类调用。

18.控制filter怎么和标量点数据,单元属性数据一起工作。默认情况下(ScalarModeToDefault),filter将会使用点数据,并且如果过没有点数据可用,单元数据将被使用。另外你能够明确的指定filter使用点数据(ScalarModeToUsePointData)或者使用单元数据(ScalarModeToUseCellData)。同样也可以从数组中得到标量从而获得point和cell数据。如果是从数组中得到的标量数据,则在调用GetColor之前要先调用SelectColorArray。当标量模式被设置为用域数据ScalarModeToFieldData,必须调用SelectColorArray来选择域数据数组而用来作为颜色单元,在这种模式下,如果聚数据有三角片,则域数据将作为单元数据使用,并且每一个小的单元由三角片组成,而不是整片组成。

set,get ScalarMode,然后就是六种不同的模式

19.  当ScalarMode设置为 使用UsePointFieldData或者UseCellFieldData,可以通过以下方法指定哪个数组用来着色。Lookuptable将会决定怎么把数组矢量转变为颜色。

SelectColorArray(int arrayNum);void SelectColorArray(const char *arrayName);

20. 这些方法用来指定组元件,这些最好在lookup table 中做。void ColorByArrayComponent(int arrayNum, int component);void ColorByArrayComponent(const char* arrayName, int component);

21.  获得 array name,id,component

  char* GetArrayName() { return this->ArrayName; }
  int GetArrayId() { return this->ArrayId; }
  int GetArrayAccessMode() { return this->ArrayAccessMode; }
  int GetArrayComponent() { return this->ArrayComponent; }    

22.返回或的标量数据的方法const char *GetScalarModeAsString();

23.Set/Get一个全局的flag来控制是否采用一致拓扑 (例如多边形上的一条线)用来避免z-buffer(并且抓住渲染问题)。如果不是off,有两个方法去选择。多边形偏移量(PolygonOffset)使用图形学系统调用去移动多边形,但是不能分辨另一个多边上的点和线。移动后的Zbuffer从新映射z-buffer去分辨点,线,多边形,但是不是总是能够产生可接受的结果。如果采用这种 ShiftZBuffer的方式,那么需要设置ResolveCoincidentTopologyZShift的值。(不是所有的mappers/graphics系统都支持这个功能)   

static void SetResolveCoincidentTopology(int val);
  static int  GetResolveCoincidentTopology();
  static void SetResolveCoincidentTopologyToDefault();
  static void SetResolveCoincidentTopologyToOff()
    { SetResolveCoincidentTopology(VTK_RESOLVE_OFF) ;}
  static void SetResolveCoincidentTopologyToPolygonOffset()
    { SetResolveCoincidentTopology(VTK_RESOLVE_POLYGON_OFFSET); }
  static void SetResolveCoincidentTopologyToShiftZBuffer()
    { SetResolveCoincidentTopology(VTK_RESOLVE_SHIFT_ZBUFFER); }

24.用来设置 polygon offset规模要素和单元 。当ResolveCoincidentTopology设置为PolygonOffset。这些都是全局变量。

static void SetResolveCoincidentTopologyPolygonOffsetParameters(
    double factor, double units);
  static void GetResolveCoincidentTopologyPolygonOffsetParameters(
    double& factor, double& units);

25.当ResolveCoincidentTopology设置为PolygonOffset。变量可以是face,也可以是点和线,默认是face。这些都是全局变量。   

 static void SetResolveCoincidentTopologyPolygonOffsetFaces(int faces);
  static int GetResolveCoincidentTopologyPolygonOffsetFaces();

26.采用z-shift方法(ShiftZBuffer):

   static void SetResolveCoincidentTopologyZShift(double val);
  static double GetResolveCoincidentTopologyZShift();

27.获得数据的边界,由这样表示: (xmin,xmax, ymin,ymax, zmin,zmax)

 virtual double *GetBounds();
  virtual void GetBounds(double bounds[6])
    { this->vtkAbstractMapper3D::GetBounds(bounds); }

28.这个实例变量被 vtkLODActor用来决定使用哪个mapper。它是对 render很重要的一个估量。但设置render time并不修改这个mapper。

 void SetRenderTime(double time) {this->RenderTime = time;}
  vtkGetMacro(RenderTime, double);                                                

29.获得输入以作为一个vtk数据集。这个方法在特定的mapper类中被覆盖从而返回更加特定的数据类型。

 vtkDataSet *GetInput();

30.同上,但是这个函数将会被用在wrapper languages中,C++中应该使用上面的GetInput()

 vtkDataSet *GetInputAsDataSet()
    { return this->GetInput(); }

31.通过lookuptable映射标量(如果有一些标量,并且ScalarVisibility is on)。返回一个 unsigned char RGBA数组。这在渲染进程中运行。alpha元素允许和另一个alpha元素(由vtkActor提供)允许标量的混合。

 vtkUnsignedCharArray *MapScalars(double alpha);

32. Set/Get光照模型中的颜色模型。

  vtkSetMacro(ScalarMaterialMode,int);
  vtkGetMacro(ScalarMaterialMode,int);
  void SetScalarMaterialModeToDefault()
    { this->SetScalarMaterialMode(VTK_MATERIALMODE_DEFAULT); }
  void SetScalarMaterialModeToAmbient()
    { this->SetScalarMaterialMode(VTK_MATERIALMODE_AMBIENT); }
  void SetScalarMaterialModeToDiffuse()
    { this->SetScalarMaterialMode(VTK_MATERIALMODE_DIFFUSE); }
  void SetScalarMaterialModeToAmbientAndDiffuse()
    { this->SetScalarMaterialMode(VTK_MATERIALMODE_AMBIENT_AND_DIFFUSE); }

33.返回light-model color mode。 const char *GetScalarMaterialModeAsString();

34.如果这个mapper不希望有半透明的几何体。这会在ColorMode设置为不使用映射标量使用(例如直接使用标量数据作为颜色,并且这些标量数据是不透明的(alpha组件))默认情况下放回true。an actor依然可以把一个几何体作为半透明的当在属性中设置了半透明属性。

 virtual bool GetIsOpaque()(是否不透明)
    { return true; }

35.下面是一些内部函数,不要使用在渲染进程外部。由vtkHardwareSelector使用判断硬件是否支持。

  virtual bool GetSupportsSelection()
    { return false; }

下面一些protected:

protected:
  vtkMapper();
  ~vtkMapper();


  vtkUnsignedCharArray *Colors;


  // Use texture coordinates for coloring.
  int InterpolateScalarsBeforeMapping;
  // Coordinate for each point.
  vtkFloatArray *ColorCoordinates;
  // 1D ColorMap used for the texture image.
  vtkImageData* ColorTextureMap;
  void MapScalarsToTexture(vtkDataArray* scalars, double alpha);

 vtkScalarsToColors *LookupTable;
  int ScalarVisibility;
  vtkTimeStamp BuildTime;
  double ScalarRange[2];
  int UseLookupTableScalarRange;
  int ImmediateModeRendering;
  int ColorMode;
  int ScalarMode;
  int ScalarMaterialMode;


  double RenderTime;


  // for coloring by a component of a field data array
  int ArrayId;
  char ArrayName[256];
  int ArrayComponent;
  int ArrayAccessMode;


  int Static;

 int ForceCompileOnly;


private:
  vtkMapper(const vtkMapper&);  // Not implemented.
  void operator=(const vtkMapper&);  // Not implemented.

结论:以上我们可以看到,在mapper类中,主要定义了父类,然后是PrintSelf和浅复制(指两个对象指向的还是同一个引用)函数   。然后是修改时间。初始化,输出图形元。创建一个默认的lookuptable。接下来就是对mapper中个函数属性的一些设置:是否使用静态数据,是否使用lookuptable来映射颜色,返回用来作为颜色的标量数据,是否用顶点颜色插值产生面的颜色,是否通过他的自己的标量范围来设置lookuptable的范围,通过制定标量的最大值和最小值来设置其范围,是否使用即时渲染控制,filter怎么和标量点数据,单元属性数据一起工作,也就是采用哪种模式作为颜色渲染。控制是否采用一致拓扑 (例如多边形上的一条线)用来避免z-buffer(并且抓住渲染问题),如果不是可以采用PolygonOffset和ShiftZBuffe,vtkLODActor用来决定使用哪个mapper,.获得输入以作为一个vtk数据集Set/Get光照模型中的颜色模型,设置透明和半透明。 其实整体上就是一个颜色的问题,渲染着色。            

18是重点,18与filter相连,而mapper与actor相连。mapper只解决颜色?actor再加纹理,属性?                                                       

你可能感兴趣的:(vtk 中vtkMapper的各函数解析)