OSG之渲染状态

307 阅读3分钟

1 渲染状态

OSG支持绝大部分的OpenGL 固定功能管道(fixed function pipeline)渲染,如Alpha 检验、Blending 融合、剪切平面、颜色蒙板、面拣选(face culling)、深度和模板检验、雾效、点和线的光栅化(rasterization)等.OSG的渲染状态也允许应用程序指定项点着色(vertex shader)和片段着色(fragment shader)。

2 osg::StateSet类

osg::StateSet类派生自osg::Referenced,以实现更好的数据共享。也就是说,共享同一个osg::StateSet 的osg::Node或osg::Drawable类不需要额外的代码来清理其内存空间。其继承关系图如下图所示。

2.png

用户的应用程序需要在osg::StateSet中设置渲染状态。可以将StateSet关联到场景图形中的任意一个节点(Node)或关联到Drawable类,正如大部分开发者所知,OpenGL程序的开发需要尽量使状态量的变化实现最小化,并避免冗余的状态设置,StateSet对象能够自动实现这些优化过程。

在OSG遍历整个场景图形时,StateSet类会对OpcnGL的状态属性堆栈进行管理。因此,用户程序可以对不同的场景图形子树作不同的状态设置。在每个子树的遍历过程中,OSG将会高效地执行保存和恢复渲染状态的操作。用户需要尽量使关联到场景图形的StateSet最小化。StateSet越少,内存的占用也越少,OSG在一次场景图形遍历中所耗费的工作量也越少。

OSG 将渲染状态分成两个部分,分别为渲染属性(Attribute)和渲染模式(Mode)。

渲染属性也就是控制渲染特性的状态变量,如雾的颜色或Blend融合函数都是OSG的状态属性。OSG中的渲染模式和OpenGL的状态特性几乎是一一对应的,这些特性在OpenGL 中通过函数glEnable0和gIDisable() 进行控制。用户程序可以设置模式量以允许或禁止某个功能,如纹理映射、灯光等。简单来说,渲染模式是指渲染的某个功能,而渲染属性是这个功能的控制变量和参数。如果要设置渲染状态的值,用户程序需要执行以下两步操作:

(1)为将要设置状态的Node或Drawable 对象提供一个StateSet实例。

(2)在StateSet实例中设置状态的渲染模式和渲染属性。

直接从某个Node或Drawable 对象中获得一个StateSet实例可以使用下面的方法:

osg::StateSettstate = obj->getOrCreateStateSet();

在上面的程序段中,obj是一个Node或Drawable 实例::getOrCreateStateSetO是这些类定义的方法, 这个方法返回一个指向 StateSet 实例的指针,该实例属于obj。如果 obj 还没有设置过与之关联的StateSet,那么这个方法返回一个新指针并将其关联到obj上。

StateSet继承自 Referenced类。与StateSet关联的Node 或Drawable 类内部使用 ref_ptr来引用 StateSet实例,因此,不是长时间引用StateSet的情况下,也可以使用标准C++指针来定义state。

如果state 变量是某个函数内的局部变量,且应用程序不会长时间引用这个StateSet,那么上面代码的使用是完全正确的。上面代码中的state变量指向该obj对象的StateSet指针,当应用程序获得了一个StateSet的指针时,就可以设置属性和模式了。