Ogre分层渲染

转载请注明出处!http://www.cnblogs.com/pulas

在超大的场景中,如果既想看到近处的物体,又想看到很远的物体,则必须把相机的远近裁剪面距离设得很大。远近裁剪面距离比例太大了,由于Depth Buffer的精度有限,这样就会导致Z-Fighting,挨在一起的物体表面会发生闪烁。

解决这个问题有两种方法,一是用Logarithmic Depth Buffer,但是由于此方法需要对每个物体在shader中计算其对数深度,所以不太具有通用性,故没有深入研究。感兴趣的可以自己试试。

相关参考资料:

http://www.gamasutra.com/blogs/BranoKemen/20090812/2725/Logarithmic_Depth_Buffer.php

http://www.gamedev.net/blog/73/entry-2006307-tip-of-the-day-logarithmic-zbuffer-artifacts-fix/

第二种方法是使用分层渲染。首先设置一个比例合适的远近裁剪面距离,渲染很远处的物体,然后清除Depth Buffer,但是保留Color Buffer。然后再设置一个比例合适的远近裁剪面距离,渲染近处的物体。Madmarx写的一系列Ogre教程so3dtools中,其中A_1_FrustumSlicing例子很好的演示了怎么在Ogre中使用分层渲染。

http://sourceforge.net/projects/so3dtools/

http://www.ogre3d.org/forums/viewtopic.php?f=2&t=65275

http://www.ogre3d.org/forums/viewtopic.php?f=2&t=46418

         bool COgreApplication::layeredRendering()

{

            // This is the same, but it updates internal statistics
// and get Listeners correctly called.
m_pMainRenderWindow->_beginUpdate(); Ogre::Real fFarClipDistance = m_pCamera->getFarClipDistance();
Ogre::Real fNearClipDistance = m_pCamera->getNearClipDistance(); // first render
m_pSceneManager->setVisibilityMask(0x00000001); {
m_pCamera->setNearClipDistance(fFarClipDistance);
m_pCamera->setFarClipDistance(fFarClipDistance*);
m_pMainViewport->setOverlaysEnabled(false);
m_pMainViewport->setShadowsEnabled(false); m_pMainRenderWindow->_updateViewport(m_pMainViewport); // back to normal
m_pMainViewport->setOverlaysEnabled(true);
m_pMainViewport->setShadowsEnabled(true);
} // second render
// 第二遍渲染要渲染所有物体,以免处于两层交界处的物体发生异样
m_pSceneManager->setVisibilityMask(0xFFFFFFFF); {
m_pMainViewport->setClearEveryFrame(true, Ogre::FBT_DEPTH);
m_pMainViewport->setSkiesEnabled(false);
m_pCamera->setNearClipDistance(fNearClipDistance);
m_pCamera->setFarClipDistance(fFarClipDistance); m_pMainRenderWindow->_updateViewport(m_pMainViewport); // go back to normal
m_pMainViewport->setSkiesEnabled(true);
m_pMainViewport->setClearEveryFrame(true, Ogre::FBT_COLOUR | Ogre::FBT_DEPTH);
} // update all other viewports...
m_pMainRenderWindow->_updateAutoUpdatedViewports(); m_pMainRenderWindow->_endUpdate(); // The drawn surface is then shown on the screen
// (google "double buffering" if you want more details).
// I always use vertical synchro.
bool lVerticalSynchro = true;
m_pMainRenderWindow->swapBuffers(lVerticalSynchro); return true;
}

调用方法:

            // I don't want it to be re-drawn when I do window->update() [2/22/2012 zhangzhonghui]
m_pMainRenderWindow->setAutoUpdated(false); // I want to update myself the content of the window, not automatically. [2/22/2012 zhangzhonghui]
m_pMainViewport->setAutoUpdated(false); // 分层渲染
layeredRendering(); // This update some internal counters and listeners.
// Each render surface (window/rtt/mrt) that is 'auto-updated' has got its 'update' function called.
m_pOgreRoot->renderOneFrame();

Ogre分层渲染 (转)的更多相关文章

  1. phalcon: 视图分层渲染,或包含其他页面

    一:视图分层显现: 比如:在一个页面中,头部.底部固定不变,只有中间部分随操作变换显示.那么可以将中间部分切出来,剩余部分用作固定框架,放入:app/views/layouts目录中,起名为:base ...

  2. Ogre内部渲染流程分析系列

    come from:http://blog.csdn.net/weiqubo/article/details/6956005 要理解OGRE引擎,就要理解其中占很重要位置的 Renderable接口, ...

  3. 转:Ogre内部渲染流程

    以下是 Ogre 的代码中的详细说明: Renderable是OGRE中所有可渲染对象的抽象接口 这个接口抽象出了在渲染管线中的被分组的离散的可渲染对象基本的方法. 此接口的实现类必须是基于单一的材质 ...

  4. OGRE启动过程详解(OGRE HelloWorld程序原理解析)

    本文介绍 OGRE 3D 1.9 程序的启动过程,即从程序启动到3D图形呈现,背后有哪些OGRE相关的代码被执行.会涉及的OGRE类包括: Root RenderSystem RenderWindow ...

  5. 终极解决maya渲染层丢材质,变线框等问题

    终极解决maya渲染层丢材质,变线框等问题 相信有很多同志在使用maya做灯光渲染的时候,经常能遇到渲染层的模型丢材质.变线框等问题,特别恶心.我也经常遇到,所以和大家分享一下我的解决或尽量避免的方法 ...

  6. Ogre参考手册(五)3.2 合成器

    3.2 合成器Compositor 合成器框架是Ogre用于全屏后处理的API.你可以通过脚本而不是API定义合成器.你可以很容易为视口实例化合成器. 合成器基础 无论是要替换还是要与主渲染窗口混合, ...

  7. 70部MAYA灯光材质渲染教程合集

    MAYA灯光材质渲染教程合集 教程格式:MP4和flv 两种格式 使用版本:教程不是一年出的教程,各个版本都有 (教程软件为英文版) 清晰度:可以看清软件上的文字 语言:部分中文字幕,其他英文(通过看 ...

  8. 转:Ogre的MaterialSystem分析

    1. Mesh .SubMesh.SubEntity和Entity 所有的Mesh对象是由SubMesh构成的,每个SubMesh代表了Mesh对象的一部分,该部分只能使用一种Meterial.如果一 ...

  9. Ogre 编辑器一(MyGUI+Ogre整合与主界面)

    在查看Ogre例子时,想看材质要里的纹理,着色器代码都需要每个去查找,非常麻烦.也想看更新每个Ogre里的对象后有什么效果.然后看到Compositor组件与粒子组件时,想到能实时编辑着色器代码实时更 ...

随机推荐

  1. 【转】Android fill_parent和wrap_content分析

    fill_parent设置一个顶部布局或控件强制性让它布满整个屏幕. wrap_content布局指根据视图内部内容自动扩展以适应其大小. 1. wrap_content <?xml versi ...

  2. Autofac 依赖注入 ASP.NET MVC5 插件机制中插件的简单实现

    一.前言 由于项目业务复杂,创建了多个插件并把他们放在了不同的项目中,项目使用AutoFac做的IOC:但是主项目可以注入,插件注入失败, 没有为该对象定义无参数的构造函数.下面就一步一步注入插件项目 ...

  3. 【进阶——种类并查集】hdu 1829 A Bug's Life (基础种类并查集)TUD Programming Contest 2005, Darmstadt, Germany

    先说说种类并查集吧. 种类并查集是并查集的一种.但是,种类并查集中的数据是分若干类的.具体属于哪一类,有多少类,都要视具体情况而定.当然属于哪一类,要再开一个数组来储存.所以,种类并查集一般有两个数组 ...

  4. 无人机DLG生产作业流程

    参考文章 无人机(AVIAN)低空摄影测量作业流程 无人机低空遥感测绘作业流程及主要质量控制点 微型无人机低空摄影测量系 无人机航空摄影测量系统引进与发展 基于复杂地形的无人机航摄系统1∶500 DL ...

  5. 链表的倒数第K个节点

    题目:输入一个链表,输出该链表中倒数第K个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个结点. package com.edu; class LinkNode{ //定义一 ...

  6. redis配置实例及redis.conf详细说明

    一.配置实例 1.redis修改持久化路径.日志路径.清缓存 redis修改持久化路径和日志路径 vim  redis.conf logfile /data/redis_cache/logs/redi ...

  7. SqlServer中输出错误消息

    raiserror('所有参数都不能为空',16,1,@@error)

  8. User experience

    User experience 以用户为中心, --通过简单的操作快速完成美好的任务 简单 聚焦,我在干什么?我接下来要干什么? 删除.隐藏,合并.分组 使用背景色,而非边框来划分区域 碎片化,电话不 ...

  9. [Hive - LanguageManual] Describe

    Describe Describe Database Describe Table/View/Column Display Column Statistics Describe Partition D ...

  10. http://www.hameister.org/JavaFX_PuzzleGame.html

    http://www.hameister.org/JavaFX_PuzzleGame.html