Ogre: 天空
2015-03-15 16:27
169 查看
[转载请保证内容的完整性和正确性]
Ogre的天空有三种实现方式:
这里有些概念可能不清楚,比如资源组,这些深入的东西会在以后说明,现在我们先学会如何使用这些功能。添加skyBox到游戏中只需要一行代码:
没有写的参数都存在默认值,现阶段一般不需要修改。Ogre中提供了多种天空材质,可以在 (OGRE_PATH)\media\materials\scripts\Examples.material 中找到。也可以自己定义一些材质。
贴两张效果图:
天空穹,也是一个盒子,但是图片的映射方式为球形映射,看上去和一个半球一样。它的函数定义:
字略多,就不写到注释里了。
curvature:曲率。值越高,效果越平滑;值越低,距离感越好。
tiling:贴图重复次数。
xsegments,ysegments:顶点缓冲区和索引缓冲区大小(vertexBufferUsage和indexBufferUsage)。
ysegments_keep:是否保留缓冲区。
添加方式和skyBox类似。效果图:
它的添加方式就有区别了。
如果没有后6个参数的话效果也还好,不过最大的问题就是它是一个水平面了。这些参数的选择需要根据实际情况改动,多次尝试才能得到最好的效果。
效果图:
函数定义:
FogMode是雾的生成方式,有四种:FOG_NONE(无),FOG_LINEAR(线性生成),FOG_EXP(指数生成),FOG_EXP2(二次指数生成)。一般采用线性生成就够了。
添加雾:
效果图:
在 (OGRE_PATH)\media\materials\scripts\Examples.material 中可以找到其相应的材质信息,把 scroll_anim 之类的动画去掉就行。
有些类找不到,比如Vector3?
在类前面加上 Ogre:: 或者加上 using namespace Ogre 。
自动退出且没报错?
看看 Ogre.log 。
天空
Ogre中天空的实现很简单,在它的SceneManager中已经实现了添加天空的方法(作者目前的功力还不足以写出效率更高的天空渲染方法),这里只是说一下具体该如何使用。Ogre的天空有三种实现方式:
SkyBOX
天空盒,六个面把摄像机包起来(这样就永远走不出去了)。这是它的函数定义:virtual void setSkyBox( bool enable,//是否启用 const String& materialName,//材质名称 Real distance = 5000,//世界坐标系下每个面到摄像机的距离 bool drawFirst = true,//渲染队列 const Quaternion& orientation = Quaternion::IDENTITY,//盒子的旋转角度 const String& groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME//资源组的名称 );
这里有些概念可能不清楚,比如资源组,这些深入的东西会在以后说明,现在我们先学会如何使用这些功能。添加skyBox到游戏中只需要一行代码:
//DemoManager.cpp sm->setSkyBox(true, "Examples/SpaceSkyBox");
没有写的参数都存在默认值,现阶段一般不需要修改。Ogre中提供了多种天空材质,可以在 (OGRE_PATH)\media\materials\scripts\Examples.material 中找到。也可以自己定义一些材质。
贴两张效果图:
skyDome
注意,是Dome,不是Demo。(我写到这之前一直以为是Demo)天空穹,也是一个盒子,但是图片的映射方式为球形映射,看上去和一个半球一样。它的函数定义:
virtual void setSkyDome( bool enable, const String& materialName, Real curvature = 10, Real tiling = 8, Real distance = 4000, bool drawFirst = true, const Quaternion& orientation = Quaternion::IDENTITY, int xsegments = 16, int ysegments = 16, int ysegments_keep = -1, const String& groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME );
字略多,就不写到注释里了。
curvature:曲率。值越高,效果越平滑;值越低,距离感越好。
tiling:贴图重复次数。
xsegments,ysegments:顶点缓冲区和索引缓冲区大小(vertexBufferUsage和indexBufferUsage)。
ysegments_keep:是否保留缓冲区。
添加方式和skyBox类似。效果图:
skyPlane
天空面,摄像机之上的一个平面。它的函数定义:virtual void setSkyPlane( bool enable, const Plane& plane,//这里要先定义一个plane const String& materialName, Real scale = 1000, Real tiling = 10, bool drawFirst = true, Real bow = 0,//曲率。0的话就是一个水平面,数值越大曲率越高。 int xsegments = 1, int ysegments = 1, const String& groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME );
它的添加方式就有区别了。
//DemoManager.cpp Plane plane; plane.d = 1000; plane.normal = Vector3::NEGATIVE_UNIT_Y; sm->_setSkyPlane(true, plane, "Examples/CloudySky", 500, 20, false, 0.5f, 150, 150);
如果没有后6个参数的话效果也还好,不过最大的问题就是它是一个水平面了。这些参数的选择需要根据实际情况改动,多次尝试才能得到最好的效果。
效果图:
Fog
天空经常要配合Fog来使用,使其效果更真实。函数定义:
void setFog( FogMode mode = FOG_NONE, const ColourValue& colour = ColourValue::White, Real expDensity = 0.001, Real linearStart = 0.0, Real linearEnd = 1.0);
FogMode是雾的生成方式,有四种:FOG_NONE(无),FOG_LINEAR(线性生成),FOG_EXP(指数生成),FOG_EXP2(二次指数生成)。一般采用线性生成就够了。
添加雾:
//DemoManager.cpp ColourValue FadeColour(0.9, 0.9, 0.9); sm->setFog(FOG_LINEAR, FadeColour, 0.0f, 15000.0f, 28000.0f);
效果图:
Tips
有些材质的天空会动,我想让它静止怎么办?在 (OGRE_PATH)\media\materials\scripts\Examples.material 中可以找到其相应的材质信息,把 scroll_anim 之类的动画去掉就行。
有些类找不到,比如Vector3?
在类前面加上 Ogre:: 或者加上 using namespace Ogre 。
自动退出且没报错?
看看 Ogre.log 。
相关文章推荐
- Ogre基础教程3:地形,天空,烟雾
- ogre天空和雾
- OGRE 摄像机与光照 地 天空 雾
- ogre 天空与雾
- Ogre2.1 分析笔记(八) 实现天空盒
- Ogre1.7的地形、天空与雾
- 菜鸟也学Ogre-地形天空雾
- 菜鸟也学Ogre-地形天空雾
- ogre的天空----SkyBox,SkyDome和SkyPlane
- Ogre 创建天空盒、天空穹、天空面
- ogre3D学习基础14 -- 雾化效果与天空面,天空盒,天空穹
- (转)Ogre天龙八部2及鹿鼎记天空顶(Skydome)镜头眩光(Lens Flare)等效果的实现
- ogre代码学习——场景、天空面、雾化
- 【Ogre编程入门与进阶】第八章 地形、天空与雾化效果
- 【Ogre编程入门与进阶】第八章 地形、天空与雾化效果
- Ogre: 天空
- OGRE之第一个程序
- Ogre 黑屏渐变的过程
- Ogre源码学习-Image和Texture
- Ogre中实现 几何面正反面不同纹理贴图