vtk中vtkRenderer各函数解析

来源:互联网 发布:软件测试好不好 编辑:程序博客网 时间:2024/06/05 01:18

vtkRenderer主要是提供了一个抽象的renderers的规范。一个renderer是一个控制对象渲染进程的对象。渲染是变换几何结构的进程,是光照,一幅图形的相机view的规范。 vtkRenderer同样也在世界坐标和view坐标(计算机图形渲染坐标系统)和display coordinates(设备上事实的screen坐标)之间执行坐标变换。更进阶的一些渲染特征,例如two-sided lighting也由这个控制。

// .SECTION See Also
// vtkRenderWindow vtkActor vtkCamera vtkLight vtkVolume

#ifndef __vtkRenderer_h
#define __vtkRenderer_h

#include "vtkRenderingCoreModule.h" // For export macro#include "vtkViewport.h"
#include "vtkVolumeCollection.h" // Needed for access in inline members
#include "vtkActorCollection.h" // Needed for access in inline members内嵌成员?

class vtkRenderWindow;
class vtkVolume;
class vtkCuller;
class vtkActor;
class vtkActor2D;
class vtkCamera;
class vtkLightCollection;
class vtkCullerCollection;
class vtkLight;
class vtkPainter;
class vtkHardwareSelector;
class vtkRendererDelegate;
class vtkTexture;

class VTKRENDERINGCORE_EXPORT vtkRenderer : public vtkViewport
{

public:

1.vtkTypeMacro(vtkRenderer,vtkViewport);父类是,vtkViewport

2.void PrintSelf(ostream& os, vtkIndent indent);输出自身

3.static vtkRenderer *New();初始化,它的New包括一个工厂类,还有自身的初始化,在工厂类中判断它是否有重载,还有注册等功能,没有重载则返回NULL,接下里则初始为:a black background, a white ambient light, two-sided lighting turned on, a viewport of (0,0,1,1), and backface culling turned off

4.  void AddActor(vtkProp *p);void AddVolume(vtkProp *p); void RemoveActor(vtkProp *p);void RemoveVolume(vtkProp *p);增加或者移出不同的props给这个renderer。这些方法与 AddViewProp and RemoveViewProp同义,且向后兼容(与actor联系)

5.增加light到light lists中void AddLight(vtkLight *);删除一个light  void RemoveLight(vtkLight *);删除所有的光照void RemoveAllLights();,返回lights集合vtkLightCollection *GetLights();

6.设置lights集,我们不能命名他为SetLights,因为需要TestSetGet   lights_exist: lights!=0  post lights_set: lights==this->GetLights():void SetLightCollection(vtkLightCollection *lights);

7.renderer中添加一个light:void CreateLight(void);

8.创建一个对于此类Renderer合适的Light  。For example, a vtkMesaRenderer should create a vtkMesaLight  in this function.   默认call vtkLight::New.

virtual vtkLight *MakeLight();

9.打开或者关闭面的双侧光。如果关闭,则只有向着lights这面会亮,另一面则是黑的。如果打开,则两面都会亮。

 vtkGetMacro(TwoSidedLighting,int);
  vtkSetMacro(TwoSidedLighting,int);
  vtkBooleanMacro(TwoSidedLighting,int);

10.打开或者关闭lights是否自动跟着相机移动重新定位。LightFollowCamera为on,则lights将会被设计为Headlights or CameraLights,将会自适应相机移动。反之则不会

  vtkSetMacro(LightFollowCamera,int);
  vtkGetMacro(LightFollowCamera,int);
  vtkBooleanMacro(LightFollowCamera,int);

11.打开或者关闭 light的自动建立,在vtk中,如果一个renderer没有light,则会自动建立一个。有些情况下可以通过以下函数使其不会自动建立

 vtkGetMacro(AutomaticLightCreation,int);
  vtkSetMacro(AutomaticLightCreation,int);
  vtkBooleanMacro(AutomaticLightCreation,int);

12.要求不在世界空间中并且在场景中的lights(例如,与相机绑定的Headlights or CameraLights)从而更新几何结构与动态相机相匹配virtual int UpdateLightsGeometryToFollowCamera(void);

以上是renderer与light的函数

13.获得volumes集:vtkVolumeCollection *GetVolumes();

14.获得在这个renderer中的所有的actors:vtkActorCollection *GetActors();

15.指定这个renderer的相机: void SetActiveCamera(vtkCamera *);

16.获得当前相机,没有则自动创建,这不会重置相机 vtkCamera *GetActiveCamera();

17.创建与这个renderer相对应的相机:virtual vtkCamera *MakeCamera();

18.如果这个flag为off,则这个renderer不会抹去背景和Zbuffer。它用来在有交叉renderer时。 RenderWindow和Render的擦除都必须设置为on,这个camera才会清除这个renderer。默认flag为on

 vtkSetMacro(Erase, int);
  vtkGetMacro(Erase, int);
  vtkBooleanMacro(Erase, int);

19.当这个flag为off,renderer命令将会被忽视,这被用来当 vtkRenderWindow or render混合只是vtkRenderWindow的一部分。默认是on

 vtkSetMacro(Draw, int);
  vtkGetMacro(Draw, int);
  vtkBooleanMacro(Draw, int);

20.这个方法捕获一个vtkProp实例需要特定控制时才被调用。也就是当 vtkRenderWindow::CaptureGL2PSSpecialProps() 。int CaptureGL2PSSpecialProp(vtkProp *);

21.把prop集合对象设置为使用当vtkRenderWindow::CaptureGL2PSSpecialProps()。这由render window 控制。

void SetGL2PSSpecialPropCollection(vtkPropCollection *);

22.往list of cullers中增加一个culler;void AddCuller(vtkCuller *);

23.从list of cullers中去除一个actor:void RemoveCuller(vtkCuller *);

24.返回cullers集vtkCullerCollection *GetCullers();

25.设置光照环境的亮度:

vtkSetVector3Macro(Ambient,double);
 vtkGetVectorMacro(Ambient,double,3);

26.设置/获取renderer可以用来渲染场景的时间。这vtkLODActor's使用。 

 vtkSetMacro(AllocatedRenderTime,double);
  virtual double GetAllocatedRenderTime();

27.获得分配时间和renderer实际上的时间的比率。TimeFactor在这个render 进程中将被时间。这可能有用 virtual double GetTimeFactor();

28.只由vtkRenderWindow调用,创建一幅图形,这是父类的一个方法,可能由子类 调用DeviceRender方法: roid Render();

29.创建一幅图形,vtkRenderer的子类必须实现这个方法。virtual void DeviceRender() =0;

30.渲染半透明的多边形几何体。默认的实现方式是采用UpdateTranslucentPolygonalGeometry().子类中能够实现深度剥离的必须覆盖这个方法。并且它更新 boolean ivar LastRenderingUsedDepthPeeling。virtual void DeviceRenderTranslucentPolygonalGeometry();

31.清除背景颜色的图像。virtual void Clear() {}

32.返回可见actors的数量。int VisibleActorCount();

33.返回可见volumes的数量。int VisibleVolumeCount();

34.计算所有可见props的包围盒。在 ResetCamera() and ResetCameraClippingRange()使用。void ComputeVisiblePropBounds( double bounds[6] );

35.封装好的ComputeVisiblePropBounds。double *ComputeVisiblePropBounds();

36.根据可见的actors的边界重置camera剪裁范围。这保证没有props被剪掉。 void ResetCameraClippingRange();

37.通过一个边界盒重置camera的剪裁范围。这个方法由 ResetCameraClippingRange()调用。如果使用了平截,这个边界将会依据camera的modelview 矩阵而变化

 void ResetCameraClippingRange( double bounds[6] );
  void ResetCameraClippingRange( double xmin, double xmax,
                                 double ymin, double ymax,
                                 double zmin, double zmax);

38.指定附近对于camera的裁剪水平面的公差,作为远端裁剪水平面距离的一个百分比。默认对于16位的zbuffers设置为0.01,对于更深层度的zbuffer设置为0.001.

 vtkSetClampMacro(NearClippingPlaneTolerance,double,0,0.99);
  vtkGetMacro(NearClippingPlaneTolerance,double);

39.根据可见的actors自动的设置camera。camera将会自动的重新定位他自己使观察点为actors的中心。并且平移它的初始视图平面,从而使所有的actors都能看到

 void ResetCamera();

40.通过特定的边界盒(xmin,xmax, ymin,ymax, zmin,zmax)设置camera。自动设置中心为边界盒中心,并且调整其自身的距离和位置维持其初始平面正常。如果视平面与视轴平行,则视轴会自动变为三维坐标系中的一条。void ResetCamera(double bounds[6]);另一个版本:void ResetCamera(double xmin, double xmax, double ymin, double ymax,
                   double zmin, double zmax);

41.指出采用哪个rendering window。这个将会自动设置,当renderer 被MakeRenderer创建时。

 void SetRenderWindow(vtkRenderWindow *);
  vtkRenderWindow *GetRenderWindow() {return this->RenderWindow;};
  virtual vtkWindow *GetVTKWindow();

42.是否使用backing store

vtkSetMacro(BackingStore,int);
  vtkGetMacro(BackingStore,int);
  vtkBooleanMacro(BackingStore,int);

43.是否打开interactive status。在同一个视口部分有多个renderers时需要被设置。(交互)

  vtkSetMacro(Interactive,int);
  vtkGetMacro(Interactive,int);
  vtkBooleanMacro(Interactive,int);

44.设置这个renderer属于的layer。当有分层renderer时才使用

  vtkSetMacro(Layer, int);
  vtkGetMacro(Layer, int);

45.如果Layer>0,设置a renderer为transparent,flag 设为true

  vtkSetMacro(PreserveDepthBuffer, int);
  vtkGetMacro(PreserveDepthBuffer, int);
  vtkBooleanMacro(PreserveDepthBuffer, int);

46.确认这个renderer是否是transparent。只要不是最底层,就可以是transparent

int  Transparent();

47.转点坐标为视坐标void WorldToView(); virtual void WorldToView(double &wx, double &wy, double &wz);

48.视坐标转变为点坐标void ViewToWorld();virtual void ViewToWorld(double &wx, double &wy, double &wz);

49.获得像素位置,返回Z value。z value通常为(0,1)之间,处于剪切面的前面和后面之间

double GetZ (int x, int y);

50.返回MTime,并且确认ivars。unsigned long GetMTime();

51.获得时间需求,第二,作为render的最后调用vtkGetMacro( LastRenderTimeInSeconds, double );

52.这个函数只在render获得了props的数量,并且采用RenderOpaqueGeometry or RenderTranslucentPolygonalGeometry调用时使用,它用来知道是否有什么东西在frame buffer中vtkGetMacro( NumberOfPropsRendered, int );

53.返回在视点中有最大z值的prop(通过vtkAssemblyPath)。

  vtkAssemblyPath* PickProp(double selectionX, double selectionY)
    {
      return this->PickProp(selectionX, selectionY, selectionX, selectionY);
    }
  vtkAssemblyPath* PickProp(double selectionX1, double selectionY1,
                            double selectionX2, double selectionY2);

54.立体渲染时在左右视点上做一些重要事情,当Paraview使用vtkIceTRenderer时使用

virtual void StereoMidpoint() { return; };

55.计算对于当前tile渲染的纵横比, tiled displays时使用 double GetTiledAspectRatio();

56. ActiveCamera存在返回1 int IsActiveCameraCreated()
    { return (this->ActiveCamera != NULL); }

57.打开或者关闭渲染半透明材质时使用深度剥离技术( depth peeling)。render window必须有alpha bits(ie call SetAlphaBitPlanes(1)),并且没有multisample buffer(ie call SetMultiSamples(0)才能支持该技术。当UseDepthPeeling on,GPU支持则其被用来渲染translucent materials,其他在为off

vtkSetMacro(UseDepthPeeling,int);
  vtkGetMacro(UseDepthPeeling,int);
  vtkBooleanMacro(UseDepthPeeling,int);

58.当采用peeling technique渲染translucent material时,定义阈值使算法停止 peel层的迭代。

vtkSetClampMacro(OcclusionRatio,double,0.0,0.5);
  vtkGetMacro(OcclusionRatio,double);

59.当使用depth peeling,定义peeling layers的最大值,初始是4,0代表没有最大限制。

  vtkSetMacro(MaximumNumberOfPeels,int);
  vtkGetMacro(MaximumNumberOfPeels,int);

60.上一次调用DeviceRenderTranslucentPolygonalGeometry()是否用了depth peeling,默认是false

vtkGetMacro(LastRenderingUsedDepthPeeling,int);

61.Set/Get一个自定义的Render call。被用在vtkRenderer::Render()中

 void SetDelegate(vtkRendererDelegate *d);
  vtkGetObjectMacro(Delegate,vtkRendererDelegate);

62.获得现在的硬件selector,Mappers/Properties对于不同的硬件环境,会选择不一样的

vtkGetObjectMacro(Selector, vtkHardwareSelector);

63.获得背景纹理:

  void SetBackgroundTexture(vtkTexture*);
  vtkGetObjectMacro(BackgroundTexture, vtkTexture);

64.是否需要一个纹理背景:默认off

vtkSetMacro(TexturedBackground,bool);
  vtkGetMacro(TexturedBackground,bool);
  vtkBooleanMacro(TexturedBackground,bool);

protected:

vtkRenderer();
  ~vtkRenderer();

内部方法获得渲染目的: 

virtual void PickRender(vtkPropCollection *props);
  virtual void PickGeometry();

扩大边界盒而形成变换矩阵

 virtual void ExpandBounds(double bounds[6], vtkMatrix4x4 *matrix);

释放图形资源:

virtual void ReleaseGraphicsResources(vtkWindow *) { }

内部参数:

vtkCamera *ActiveCamera;
  vtkLight  *CreatedLight;
  vtkLightCollection *Lights;
  vtkCullerCollection *Cullers;
  vtkActorCollection *Actors;
  vtkVolumeCollection *Volumes;
  double              Ambient[3];
  vtkRenderWindow    *RenderWindow;
  double              AllocatedRenderTime;
  double              TimeFactor;

 int                TwoSidedLighting;
  int                AutomaticLightCreation;
  int                BackingStore;
  unsigned char      *BackingImage;
  int                BackingStoreSize[2];
  vtkTimeStamp       RenderTime;
  double              LastRenderTimeInSeconds;
  int                LightFollowCamera;

分配时间给每个prop

 void               AllocateTime();

在每个分类中,要被渲染和已经被渲染的props的数量int                NumberOfPropsRendered;

一个暂时的list of props for culling(剔除),当渲染时遍历所有的props

 vtkProp            **PropArray;
  int                PropArrayCount;

用于picking的一个暂时列:

  vtkAssemblyPath    **PathArray;
  int                PathArrayCount;

交互事件参数:int                Interactive;

分层renderer,表明renderer属于哪个层: int                Layer;int                PreserveDepthBuffer;

对于 wrapped languages可见 double              ComputedVisiblePropBounds[6];

支出与剪切面的距离的最小值作为与远剪切面的距离的百分比。值比这个阈值小的属于NearClippingPlaneTolerance*range[1],之太小会在使用low z-buffer resolution产生系统问题。double              NearClippingPlaneTolerance;

 int Erase;

int Draw;

vtkPropCollection *GL2PSSpecialPropCollection;

friend class vtkRenderPass;friend 类,用来使render可以被其他允许的方法调用。

virtual int UpdateGeometry();

virtual int UpdateTranslucentPolygonalGeometry();

virtual int UpdateCamera(void);

virtual int UpdateLightGeometry(void);

virtual int UpdateLights(void) {return 0;}

下面还有一些前面提到的函数的参数,就不细讲了,大致的意思都一样。

总结:从以上的函数我们可以看出,整个的renderer类,他主要有以下几个方面:

与各prop联系,也就是联通上一层(actor,volume)

光照,双侧光,光与相机的关系

相机的建立

Erase:抹去背景和Zbuffe

Draw参数控制render

cullers list中culler和actor的添加,可见actors和volume的数量

TimeFactor,时间比率

边界盒,裁剪范围,背景纹理

采用哪个 renderer window ,是否使用backing store,interactive status

renderer属于的layer,层的关系

视和点坐标的变换

深度剥离(peeling techniqu)技术的相关的renderer的设置

还有一些内部参数



0 0