几种阴影类型
enum ShadowTechnique
{
SHADOWTYPE_NONE, // 无阴影
SHADOWTYPE_STENCIL_MODULATIVE, // 模版调制阴影
SHADOWTYPE_STENCIL_ADDITIVE, // 模版叠加阴影
SHADOWTYPE_TEXTURE_MODULATIVE, // 纹理调制阴影
};
Ogre:: SceneManager 类中有一群阴影相关的方法,下面逐一列举并简单说明:
设置/获取阴影技术
virtual void setShadowTechnique (ShadowTechnique technique)
virtual ShadowTechnique getShadowTechnique (void) const
设置/获取调试阴影显示状态
至于什么是调试阴影 (Debug Shadows) ,你把它打开看看就知道了
virtual void setShowDebugShadows (bool debug)
virtual bool getShowDebugShadows (void) const
设置/获取阴影颜色
virtual void setShadowColour (const ColourValue &colour)
virtual const ColourValue & getShadowColour (void) const
设置/获取方向光阴影影响距离
物体距灯光超过这个距离,就不再计算它的阴影以节省场景运算。
virtual void setShadowDirectionalLightExtrusionDistance (Real dist)
virtual Real getShadowDirectionalLightExtrusionDistance (void) const
设置/获取阴影最大可见距离
阴影距镜头超过这个距离,就不再在视野中显示。注意这个跟上面的方向光阴影影响距离不同,上面那个是指物体距灯光的最大距离,这个是指阴影本身距镜头的最大距离。
virtual void setShadowFarDistance (Real distance)
virtual Real getShadowFarDistance (void) const
设置/获取阴影索引缓存大小
为了计算物体的阴影, OGRE 在 GPU 中设置了一个缓存区用于保存物体的顶点索引,默认是 51,200 个,大约占用 100KB GPU ,足够渲染大约 17,000 个三角形。你可以修改这个索引缓存的大小,使之适合场景中物体的顶点总数,顶点总数大约等于三角形总数的 3 倍。
virtual void setShadowIndexBufferSize (size_t size)
virtual size_t getShadowIndexBufferSize (void) const
设置/获取阴影纹理尺寸
当你使用纹理调制阴影技术( SHADOWTYPE_TEXTURE_MODULATIVE )的时候, OGRE 需要先把物体的阴影渲染到一张纹理贴图上,然后再与地板或墙壁做调制运算。这张纹理贴图的尺寸越大,阴影看上去就越清晰;尺寸越小,阴影看上去就越粗糙。
但是要注意,如果你使用 OpenGL 渲染系统,纹理贴图的边长不能超过 OGRE 渲染窗口的尺寸,一般设置为不大于 512 。
virtual void setShadowTextureSize (unsigned short size)
unsigned short getShadowTextureSize (void) const
设置/获取阴影纹理数目
当你使用纹理调制阴影技术( SHADOWTYPE_TEXTURE_MODULATIVE )的时候,每张阴影纹理贴图只能渲染一盏灯光所产生的阴影,所以如果场景中存在多盏灯光,你可能需要把阴影纹理数目相应调大以使每盏灯光都可以投射阴影。
virtual void setShadowTextureCount (unsigned short count)
unsigned short getShadowTextureCount (void) const
设置阴影纹理设定
这个方法是上面两个方法的结合版,同时设置阴影纹理的尺寸和个数。
virtual void setShadowTextureSettings (unsigned short size, unsigned short count)
设置方向光阴影纹理偏移
当你使用纹理调制阴影技术( SHADOWTYPE_TEXTURE_MODULATIVE )的时候, OGRE 首先对每盏方向光产生一张阴影纹理,具体做法就是,把这盏灯光作为一个镜头,把这个镜头中看到的投影物体渲染下来,不是真实的渲染,只是用单色渲染出来一个“影子”,影子的边缘之外都是透明的,然后把这张阴影纹理蒙到物体所投射到的表面。
而这个方向光阴影纹理偏移,是控制在渲染这张阴影纹理的时候,纹理距离作为“镜头”的光源的远近。纹理距离“镜头”太近,会导致纹理贴图的大部分边缘区域超出了“镜头”的视野之外,所以我们使用这个纹理偏移,使这张纹理图远离作为“镜头”的光源中心,以最大限度地利用纹理贴图的空间。当场景很大的时候,这个纹理偏移很有用。
打个比方,手电筒发射光束,打在远处的墙上形成一个大光圈,我们拿着一张报纸截断这束光,距离手电筒越近,光打在报纸上的光圈就越小,报纸上就有更多的边缘区域是黑暗的,对于阴影纹理来说,就是有更多的边缘区域没有被利用,浪费了。
这个偏移值是一个从 0 到 1 的比率:从光源位置到 ShadowFarDistance * 2 。
virtual void setShadowDirLightTextureOffset (Real offset)
设置阴影纹理淡出起始距离/结束距离
这两个距离也是从 0 到 1 的比率:占 setShadowFarDistance 所指定的阴影最大可见距离的比率。它指定当阴影上的一点距离镜头超过起始距离之后,这一点上的阴影就开始变淡,直到达到结束距离就完全看不见了。效果可以参看下面的截图,可以看到近处的阴影颜色比远处的深一些。
virtual void setShadowTextureFadeStart (Real fadeStart)
virtual void setShadowTextureFadeEnd (Real fadeEnd)
设置是否使用阴影无限远截面
当阴影的投射距离超出镜头的远视距离之后,阴影的计算就会出毛病,导致场景变花。为了解决这个问题,我们对阴影使用一个无限远的投射平面,可以一定程度上防止阴影计算错误。
virtual void setShadowUseInfiniteFarPlane (bool enable)
具体的细节差异,修改一下源代码的各项参数观察一下。
设置了阴影技术之后,还不算完,还需要打开各个物体的阴影属性包括光源的阴影属性,使用 setCastShadows 方法:
void Ogre::MovableObject:: setCastShadows ( bool enabled ) [inline, inherited]
最后要注意,纹理阴影相关的很多方法都只对方向光起作用,不支持点光源或锥形光。
另外ogre 创建的ManualObject 对象需要转换成mesh文件,才可以产生阴影