Ogre分层渲染 (转)
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分层渲染 (转)的更多相关文章
- phalcon: 视图分层渲染,或包含其他页面
一:视图分层显现: 比如:在一个页面中,头部.底部固定不变,只有中间部分随操作变换显示.那么可以将中间部分切出来,剩余部分用作固定框架,放入:app/views/layouts目录中,起名为:base ...
- Ogre内部渲染流程分析系列
come from:http://blog.csdn.net/weiqubo/article/details/6956005 要理解OGRE引擎,就要理解其中占很重要位置的 Renderable接口, ...
- 转:Ogre内部渲染流程
以下是 Ogre 的代码中的详细说明: Renderable是OGRE中所有可渲染对象的抽象接口 这个接口抽象出了在渲染管线中的被分组的离散的可渲染对象基本的方法. 此接口的实现类必须是基于单一的材质 ...
- OGRE启动过程详解(OGRE HelloWorld程序原理解析)
本文介绍 OGRE 3D 1.9 程序的启动过程,即从程序启动到3D图形呈现,背后有哪些OGRE相关的代码被执行.会涉及的OGRE类包括: Root RenderSystem RenderWindow ...
- 终极解决maya渲染层丢材质,变线框等问题
终极解决maya渲染层丢材质,变线框等问题 相信有很多同志在使用maya做灯光渲染的时候,经常能遇到渲染层的模型丢材质.变线框等问题,特别恶心.我也经常遇到,所以和大家分享一下我的解决或尽量避免的方法 ...
- Ogre参考手册(五)3.2 合成器
3.2 合成器Compositor 合成器框架是Ogre用于全屏后处理的API.你可以通过脚本而不是API定义合成器.你可以很容易为视口实例化合成器. 合成器基础 无论是要替换还是要与主渲染窗口混合, ...
- 70部MAYA灯光材质渲染教程合集
MAYA灯光材质渲染教程合集 教程格式:MP4和flv 两种格式 使用版本:教程不是一年出的教程,各个版本都有 (教程软件为英文版) 清晰度:可以看清软件上的文字 语言:部分中文字幕,其他英文(通过看 ...
- 转:Ogre的MaterialSystem分析
1. Mesh .SubMesh.SubEntity和Entity 所有的Mesh对象是由SubMesh构成的,每个SubMesh代表了Mesh对象的一部分,该部分只能使用一种Meterial.如果一 ...
- Ogre 编辑器一(MyGUI+Ogre整合与主界面)
在查看Ogre例子时,想看材质要里的纹理,着色器代码都需要每个去查找,非常麻烦.也想看更新每个Ogre里的对象后有什么效果.然后看到Compositor组件与粒子组件时,想到能实时编辑着色器代码实时更 ...
随机推荐
- iOS-利用AFNetworking(AFN 1.x)-实现文件断点下载
转:http://www.kaifazhe.com/ios_school/380066.html 官方建议AFN的使用方法 1. 定义一个全局的AFHttpClient:包含有 1> baseU ...
- Druid连接池简单入门
偶尔的机会解释Druid连接池,后起之秀,但是评价不错,另外由于是阿里淘宝使用过的所以还是蛮看好的. 1.jar包依赖--Druid依赖代码 <dependency> <groupI ...
- hdu 2087-剪花布条(KMP)
题意: 求文本串最多可以分成几个模式串. 分析: KMP #include <map> #include <set> #include <list> #includ ...
- aspx与ascx,ashx的用法详细的总结介绍
这篇文章主要是对aspx与ascx,ashx的用法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 做asp.net开发的对.aspx,.ascx和.ashx都不会陌生.关于它们,网 ...
- 【和我一起学python吧】python的数据类型
python的元组.列表.字典数据类型是很python(there python is a adjective )的数据结构.这些结构都是经过足够优化后的,所以如果使用好的话,在某些area会有很大的 ...
- 2016年VR&AR有市场吗?
新霸哥发现了近期虚拟现实(VR)和增强现实(AR)非常火,已经成为了科技产业中最具前景的技术之一.其实说起这两项技术的应用,人们最容易把它与电子游戏联系在一起,那么在2016年VR&AR有市场 ...
- Tkinter教程之Pack篇
本文转载自:http://blog.csdn.net/jcodeer/article/details/1813077 '''Tkinter教程之Pack篇'''#Pack为一布局管理器,可将它视为一个 ...
- json字符串转换为JSONObject和JSONArray
一.下载json 具体到http://www.json.org/上找java-json下载,并把其放到项目源代码中,这样就可以引用其类对象了 二.具体转化过程 //JSONObject String ...
- wine的中文字体显示
从1.1.4开始wine的界面就已经支持中文了,但是对于软件中的中文支持并不太好,主要原因.还是字体...Let's go 首先,copy一下字体:把simsun.ttc (即宋体)复制到 ~/.wi ...
- MySQL锁问题最佳实践
最近一段时间处理了较多锁的问题,包括锁等待导致业务连接堆积或超时,死锁导致业务失败等,这类问题对业务可能会造成严重的影响,没有处理经验的用户往往无从下手.下面将从整个数据库设计,开发,运维阶段介绍如何 ...