博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ogre分层渲染 (转)
阅读量:6156 次
发布时间:2019-06-21

本文共 3060 字,大约阅读时间需要 10 分钟。

转载请注明出处!

 

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

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

相关参考资料:

 

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

         

         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*1000);                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();
你可能感兴趣的文章
介绍自己的一个Android插桩热修复框架项目QuickPatch
查看>>
关于textarea的ie9的maxlength不起作用的问题,请参考如下URL解决。
查看>>
勒索病毒GANDCRAB新变种GANDCRAB V5.2新变种来袭 你中招了吗?
查看>>
Solr Facet 查询
查看>>
C++类的继承一
查看>>
数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案...
查看>>
巧用VMware Workstation的clone来制作虚拟机模板
查看>>
Spring-Mybatis MapperScannerConfigurer 取不到PropertyPlaceholderConfigurer里的值
查看>>
HP DL380G4服务器前面板指示灯的含义
查看>>
数据结构_树结构
查看>>
常用URL地址
查看>>
每天一个linux命令(19):find 命令概览
查看>>
MySQL kill操作
查看>>
windows下看端口占用
查看>>
Decommissioning a Domain Controller 降域控
查看>>
Character中的奇葩
查看>>
c++书籍推荐
查看>>
canvas.translate(x,y)
查看>>
PHP判断远程图片或文件是否存在
查看>>
【LeetCode】TreeNode类实现解析(java实现)
查看>>