《火炬之光》貌似是最近挺惹人注目的游戏了。我所高兴的是这个游戏是Ogre做的,那么按老外的习惯,里面的模型材质纹理等都是暴露的了。下了一个果不其然。不过真正让我注目的是,这款游戏确实挺不错,一个非商业图形引擎能做成这样是很不错的了,其中我关注到了这样一个效果:

即人物被遮挡后的透视效果。

想了很久不知道如何下手,天一给我发了个博客,立马茅塞顿开。

http://blog.csdn.net/xoyojank/archive/2009/11/09/4791555.aspx

引用这篇文章的步骤:

1. 先画场景

2. 画被遮挡的部分, ZWrite=False; ZFunc=Greater; 开启Alpha混合, 光照亮度做为alpha值输出, 颜色由参数传入.

3. 还原正常的渲染状态, 绘制原模型(为了显示未被遮挡的部分)

在Ogre中实现也是不难的。

在材质的通道里加上两行设置就可以实现透视效果,再用正常材质绘制一次模型即可。

我改了下1.6SDK Sample里的DemoTransparency项目,代码如下

[cpp] view plain copy print ?
  1. //创建要遮挡的"墙",在这里就用一个平面代替
  2. Entity *planeEnt = mSceneMgr->createEntity("Plane", SceneManager::PT_PLANE);
  3. //设置平面的材质
  4. planeEnt->setMaterialName("Examples/RustySteel");
  5.   //创建透视模型
  6. Entity* entityMask = mSceneMgr->createEntity("entityMask", "OgreHead.mesh");
  7. entityMask->setMaterialName("Examples/TransparentTest");
  8.   //创建正常模型
  9.   Entity* entity = mSceneMgr->createEntity("normalEntity", "OgreHead.mesh");
  10.   //将这3个物体附着到场景节点上
  11. SceneNode* rootNode = mSceneMgr->getRootSceneNode();
  12. rootNode->attachObject(planeEnt);
  13. rootNode->attachObject(entityMask);
  14.   SceneNode* node = rootNode->createChildSceneNode();
  15.   node->attachObject(entity);

//创建要遮挡的"墙",在这里就用一个平面代替 Entity *planeEnt = mSceneMgr->createEntity("Plane", SceneManager::PT_PLANE); //设置平面的材质 planeEnt->setMaterialName("Examples/RustySteel"); //创建透视模型 Entity* entityMask = mSceneMgr->createEntity("entityMask", "OgreHead.mesh"); entityMask->setMaterialName("Examples/TransparentTest"); //创建正常模型 Entity* entity = mSceneMgr->createEntity("normalEntity", "OgreHead.mesh"); //将这3个物体附着到场景节点上 SceneNode* rootNode = mSceneMgr->getRootSceneNode(); rootNode->attachObject(planeEnt); rootNode->attachObject(entityMask); SceneNode* node = rootNode->createChildSceneNode(); node->attachObject(entity);

这些都是基本代码,主要是"Examples/TransparentTest"这个材质

我修改了Ogre自带的这个材质,代码如下

material Examples/TransparentTest
{
  technique
  {
    pass
    {
      ambient 0.2 0.2 0.2
      scene_blend add

      //重点是这两行
      depth_write off       //使像素不更新深度缓冲
      depth_func greater       //检测深度值的函数,greater参数即将要写入

                         //的像素的深度大于现在缓冲区内容的深度,则写入

                           //通俗来说就是只显示被遮盖的部分

                         //使用这条设置的前提是深度检测是打开的,即depth_check on
                         //不过它默认就是这样的,所以再次就不用再写一次了

      //下面的两个纹理单元起的效果是旋转的材质效果,不是本文重点

      //需要研究可参看Ogre手册

      texture_unit
      {
        texture Water01.jpg
        scroll_anim 0.25 0  

      }

      texture_unit
      {
        texture Water01.jpg
        wave_xform scroll_y sine 0 0.1 0 0.5
      }
    }

  }
}

最终效果如下

火炬之光中人物被遮挡效果在Ogre中的实现方法相关推荐

  1. 3D游戏中人物换装解决方案

    换装基本上是每个网游都必须有的一个功能,每种网游的做法都各有不同,有些是换掉整个模型,有些则是通过可以换掉模型的一个部分完成.前者属于整体换,相对简单些:后者则是通过部分替换实现,目前用的比较多,本文 ...

  2. 西游记中人物对应PMP项目管理中的角色分析

    西游记中人物对应PMP项目管理中的角色分析 一.引子 近期我一直在学习PMP(Project Management Professional),PMP指的是项目管理专业人士资格认证.经过4天的强度训练 ...

  3. 一种新型分割图像中人物的方法,基于人物动作辨认

    想要进行图像分割,传统方法是先检测图中物体,在进行分离.在本文中,来自清华大学.腾讯AI研究室和英国卡迪夫大学的研究者们提出了一种新型分割图像中人物的方法,基于人物动作辨认.以下是论智对原文的编译. ...

  4. 统计中文文本中人物出现次数

      大家好,今天跟大家介绍一下如何统计文本中人物出现的次数? 共现关系 统计人物出现次数和人物关系输出到文件 一.共现关系:   在文献计量学中,关键词的共词方法常用来确定该文献集所代表学科中各主题之 ...

  5. 【全球品牌】圣经中人物的名字有哪些?

    以前学英语死不想学,还任性.现在为了生存,英语大把的学,为了了解全球消费心理学,不得不关注很多东西.真是人都是逼出来的.你要是不成功,只能你没遇到逼你的事情.本文之后的内容就不是原创了. /**< ...

  6. 数据分析金庸武侠经典人物,我们喜欢江湖中的这群人

    致敬金庸,数据分析小说人物. 2018年10月30日,一代大侠金庸辞世,享年94岁. 飞雪连天射白鹿,笑书神侠倚碧鸳,再加一部<越女剑>.17年,15部小说,所有的刀光剑影,所有的柔肠百转 ...

  7. Ogre中SDL转为OIS相关内容

    Xcode Ogre1.10中加入OIS库实现SDL和OIS切换 一.         关于OIS库以及头文件的引用 关于OIS库及头文件我自己引用的Ogre1.9中的库及文件, 首先将文件导入Ogr ...

  8. 视频中人物识别--tensorflow介绍

    在开始写视频中人物的识别时用到的知识点有cnn与tensorflow,在此首先介绍一下其中应用到深度学习框架tensorflow. 1 深度学习框架介绍前的"废话" 到目前为止深度 ...

  9. CNN实现摄像头中人物的识别

    在此之前我已经大概说过tensorflow的简单流程,中间应用函数我会在例子中加以注释(更详细的可以查阅tensorflow中的函数讲解).应用cnn实现的视频中人物识别,本想先讲一下cnn的原理,但 ...

最新文章

  1. selenium+chromedriver爬取淘宝美食信息保存到MongoDB
  2. Redis bitmap使用场景示例
  3. HihoCoder 1323 回文字符串
  4. 在matlab中ungetfile后,11条Matlab实用小技巧
  5. 基于JAVA+SpringMVC+MYSQL的球队管理系统
  6. 创建.NET Core程序的Nuget Package
  7. IOS检查更新的方法
  8. Servlet容器:Jetty和tomcat的比较
  9. 创业教父Paul Graham: 穷途末路还是康庄大道
  10. 当你第一次发送ping请求包,ARP缓存表为空时会发生什么?(详细解析全过程)
  11. 录像机中码流类型中定时、事件、网传代表什么意思?
  12. Linux shell脚本中分号的作用
  13. 12个最应该使用的Linux服务器OS(上)
  14. eval 函数 java_[Java教程]eval()函数用法详解
  15. 静态方法vs非静态方法
  16. 不错的sed命令详解
  17. “水火”之间:投资与投机
  18. Axure RP9遮罩效果
  19. 声音导引系统及信号采集处理电路设计
  20. 【最新方案】解决谷歌Chrome浏览器内置翻译功能无法使用问题

热门文章

  1. 被动环绕解码混音方法
  2. fusioncompute6.0更改web端管理系统密码
  3. 软件开发模型 - 瀑布模型 快速原型模型 增量模型 螺旋模型 及优缺点详解
  4. (转)真刀真枪压测:基于TCPCopy的仿真压测方案
  5. 直播APP平台应该如何规范化管理
  6. 大数据可视化课程笔记 7
  7. java随机组卷和手动组卷功能实现
  8. COBOL语言程序结构
  9. 北京大学王选计算所数据管理研究室招聘启事
  10. OFDM中循环前缀CP的作用