zoukankan      html  css  js  c++  java
  • 阴影(转载)

    几种阴影类型
    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文件,才可以产生阴影

  • 相关阅读:
    网页加速的14条优化法则 网站开发与优化
    .NET在后置代码中输入JS提示语句(背景不会变白)
    C语言变量声明内存分配
    SQL Server Hosting Toolkit
    An established connection was aborted by the software in your host machine
    C语言程序设计 2009春季考试时间和地点
    C语言程序设计 函数递归调用示例
    让.Net 程序脱离.net framework框架运行
    C语言程序设计 答疑安排(2009春季 110周) 有变动
    软件测试技术,软件项目管理 实验时间安排 2009春季
  • 原文地址:https://www.cnblogs.com/ylwn817/p/2671490.html
Copyright © 2011-2022 走看看