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的设置
还有一些内部参数