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 生成含签名文件的apk安装包

    做android开发时,必然需要打包生成apk文件,这样才能部署.作为一个完善的apk,必然少不了签名文件,否则下次系统无法进行更新. 一.签名文件的制作及打包生成APK文件 签名文件比较流行的制作方 ...

  2. ch02-HTML的基本概念

    HTML的基本概念 Ch02: HTML的基本概念 1, 标记: 每一组HTML标记,都会被放在"<>"里面,用于控制里面的文字显示效果及其它一些用途. 语法: 开始标 ...

  3. 【原创】用python实现shell的tail操作

    在工作过程中发现监控实时刷新文件时,不是那么的任性. 故结合shell中的tail,做了一个类似tail的python脚本. 详情如下: #!/usr/bin/env python #coding=u ...

  4. 改变DEV控件的字体 z

    改变所有的组件字体,使用AppearanceObject.DefaultFont属性:static void Main() {    DevExpress.Utils.AppearanceObject ...

  5. Delphi 712操作word

    //导出Wordprocedure TFrm_Computing.ExportWord;var wordApp, WordDoc, WrdSelection, wrdtable, wrdtable1, ...

  6. Linux基本命令(1)管理文件和目录的命令

    Linux管理文件和目录的命令 命令 功能 命令 功能 pwd 显示当前目录 ls 查看目录下的内容 cd 改变所在目录 cat 显示文件的内容 grep 在文件中查找某字符 cp 复制文件 touc ...

  7. 【和我一起学python吧】Python安装、配置图文详解

     Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境( ...

  8. bzoj 3732 Network(最短路+倍增 | LCT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3732 [题意] 给定一个无向图,处理若干询问:uv路径上最长的边最小是多少? [思路一 ...

  9. 纯CSS3实现宽屏二级下拉菜单

    今天我们要来分享一款基于纯CSS3的宽屏二级下拉菜单,这款菜单的子菜单在展开的时候是很宽敞的,菜单项中可以自定义格式的内容,非常实用,也很大气.由于是用纯CSS3实现,所以这款下拉菜单不用运行Java ...

  10. Crontab设置定时任务

    ​ Crontab文件格式 文件格式: minute hour day month weekday username command 格式解析 字段 描述 minute 分,值为0-59 hour 小 ...