游戏的遮挡半透,一般2种方法,一种是天龙的那种,让遮挡的建筑物半透明,一种是火炬之光的这种,X射线

那种好?其实达到效果都行,

火炬之光不能用第一种,因为他的模型都是很大很大的,建筑一透,全透了,很多地方可能还会穿帮,

我的游戏一直用的第一种,也没去研究Xray,但是有朋友问起这个问题,就花了2天时间详细研究了一下.

不研究不知道,一研究才发现,其实有很多细节要注意的呢,那我们开始分析了

1.火炬之光中人物不能自己挡自己.

解决方案:不写深度就完了,深度永远控制在遮挡物那里,

2.火炬之光中有的建筑可以透,有的却不能透,不是所有建筑都能透的哦

解决方案:分渲染队列,可以透的渲染队列为3,人物的渲染队列为4,不能透的建筑渲染队列为5

3.火炬之光中没用shader实现,而且角色材质里面只是一些简单的pass

解决方案:说明火炬之光是固定渲染管线实现的,而且不是在material中写的,而是代码中实现,操作整个渲染队列实现的

,其实这种操作整个渲染队列的方法很好,不用更改角色材质,就可以实现效果.那我也照做,

我的整个实现思路为,

1.监听整个角色的渲染队列,

2.角色队列渲染2次,第一次渲染被遮挡像素,第2次渲染未被遮挡像素

3.渲染被遮挡像素的时候,禁用渲染状态的改变(就是禁止角色的材质),用自己设置的渲染状态去渲染光照信息

场景混合采用add,因为火炬之光就是add,

网上有人用alpha混合去实现的...如果用光照亮度当alpha混合,那么固定渲染管线是实现不了的,因为要在片段程序里面才能把输出颜色加上alpha...而火炬之光也没有用shader...so,我们用固定渲染管线...

代码

由于公司的一些原因,代码只好取消了,前一周我是提供了代码的.见谅

第一步,初始化上面这个类:

view plain copy to clipboard
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

  1. mSceneManager = mRoot->createSceneManager("OctreeSceneManager");
  2. // 2011.4.5 LuoYinan 实现X-Ray半透效果
  3. static XRayRenderQueueListener sXRayRenderQueueListener;
  4. mSceneManager->addRenderQueueListener(&sXRayRenderQueueListener);
view plain
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

  1. mSceneManager = mRoot->createSceneManager("OctreeSceneManager");
  2. // 2011.4.5 LuoYinan 实现X-Ray半透效果
  3. static XRayRenderQueueListener sXRayRenderQueueListener;
  4. mSceneManager->addRenderQueueListener(&sXRayRenderQueueListener);

第二步:更改Ogre源码,因为Ogre有个bug,调用_suppressRenderStateChanges以后,不会去渲染不接受阴影的对象

找个这个函数renderBasicQueueGroupObjects.改成如下:

view plain copy to clipboard
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

  1. //-----------------------------------------------------------------------
  2. void SceneManager::renderBasicQueueGroupObjects(RenderQueueGroup* pGroup,
  3. QueuedRenderableCollection::OrganisationMode om)
  4. {
  5. // Basic render loop
  6. // Iterate through priorities
  7. RenderQueueGroup::PriorityMapIterator groupIt = pGroup->getIterator();
  8. while (groupIt.hasMoreElements())
  9. {
  10. RenderPriorityGroup* pPriorityGrp = groupIt.getNext();
  11. // Sort the queue first
  12. pPriorityGrp->sort(mCameraInProgress);
  13. // Do solids
  14. renderObjects(pPriorityGrp->getSolidsBasic(), om, true, true);
  15. // 2011.4.5 modify by LuoYinan
  16. renderObjects(pPriorityGrp->getSolidsNoShadowReceive(), om, true, true);
  17. // Do unsorted transparents
  18. renderObjects(pPriorityGrp->getTransparentsUnsorted(), om, true, true);
  19. // Do transparents (always descending)
  20. renderObjects(pPriorityGrp->getTransparents(),
  21. QueuedRenderableCollection::OM_SORT_DESCENDING, true, true);
  22. }// for each priority
  23. }
view plain
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

  1. //-----------------------------------------------------------------------
  2. void SceneManager::renderBasicQueueGroupObjects(RenderQueueGroup* pGroup,
  3. QueuedRenderableCollection::OrganisationMode om)
  4. {
  5. // Basic render loop
  6. // Iterate through priorities
  7. RenderQueueGroup::PriorityMapIterator groupIt = pGroup->getIterator();
  8. while (groupIt.hasMoreElements())
  9. {
  10. RenderPriorityGroup* pPriorityGrp = groupIt.getNext();
  11. // Sort the queue first
  12. pPriorityGrp->sort(mCameraInProgress);
  13. // Do solids
  14. renderObjects(pPriorityGrp->getSolidsBasic(), om, true, true);
  15. // 2011.4.5 modify by LuoYinan
  16. renderObjects(pPriorityGrp->getSolidsNoShadowReceive(), om, true, true);
  17. // Do unsorted transparents
  18. renderObjects(pPriorityGrp->getTransparentsUnsorted(), om, true, true);
  19. // Do transparents (always descending)
  20. renderObjects(pPriorityGrp->getTransparents(),
  21. QueuedRenderableCollection::OM_SORT_DESCENDING, true, true);
  22. }// for each priority
  23. }

另外,合成器的源码也要小改,合成器链有个队列监听,那个监听在某些时候会跳过我们的队列,导致合成器的问题,不能让他跳过队列所以

view plain copy to clipboard
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

  1. void CompositorChain::RQListener::renderQueueStarted(uint8 id,
  2. const String& invocation, bool& skipThisQueue)
  3. {
  4. // Skip when not matching viewport
  5. // shadows update is nested within main viewport update
  6. if (mSceneManager->getCurrentViewport() != mViewport)
  7. return;
  8. flushUpTo(id);
  9. /// If noone wants to render this queue, skip it
  10. /// Don't skip the OVERLAY queue because that's handled seperately
  11. if(!mOperation->renderQueues.test(id) && id!=RENDER_QUEUE_OVERLAY
  12. && id != RENDER_QUEUE_4) // 2011.4.15 add by LuoYinan. don't skip XRay queue
  13. {
  14. skipThisQueue = true;
  15. }
  16. }
view plain
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

  1. void CompositorChain::RQListener::renderQueueStarted(uint8 id,
  2. const String& invocation, bool& skipThisQueue)
  3. {
  4. // Skip when not matching viewport
  5. // shadows update is nested within main viewport update
  6. if (mSceneManager->getCurrentViewport() != mViewport)
  7. return;
  8. flushUpTo(id);
  9. /// If noone wants to render this queue, skip it
  10. /// Don't skip the OVERLAY queue because that's handled seperately
  11. if(!mOperation->renderQueues.test(id) && id!=RENDER_QUEUE_OVERLAY
  12. && id != RENDER_QUEUE_4) // 2011.4.15 add by LuoYinan. don't skip XRay queue
  13. {
  14. skipThisQueue = true;
  15. }
  16. }

第三步:记得设置渲染队列

RENDER_QUEUE_3  -->要半透的建筑队列

RENDER_QUEUE_4  -->玩家队列

RENDER_QUEUE_MAIN -->不透的建筑队列

-------------------------------------------------------------------------------------------------

最后效果,颜色可能还要调试下

用Ogre固定渲染管线实现火炬之光X-RAY效果 .相关推荐

  1. html背景自动切换带滚动,利用CSS固定背景交替实现视差滚动效果

    利用CSS固定背景交替实现视差滚动效果 Sponsor 视差滚动效果的网页设计案例我们分享过很多,实现这个功能一般都需要JS,而且比较复杂.没关系,今天设计达人网小编向大家介绍另外一种简单的视差效果技 ...

  2. 制作RPG独立游戏练习(二)内置渲染管线中实现风格化PBR效果

    游戏的研发大概有3个月了,都是业余时间边学边做,还是觉得在项目里面实操学得扎实牢靠. 目标平台是手机....(优化后,目前测试的是中高端机型) 目前是在unity里面实时光的效果打包到手机里的实机画面 ...

  3. 滚动页面,实现导航栏固定在顶部(吸顶效果)

    内容说明 页面中有导航栏,当页面滚动超出一定范围时,它会固定在设置好的位置,一般是固定在顶部. 本文有两种方式实现,一种是sticky,兼容不好:另外一种是sticky的解体..兼容效果万能 1.首先 ...

  4. 如何实现label长度固定,文字分散分布的效果

    我们经常会看到表单填写时前面的label,都是左右对齐的,即使字数不一样.就像下面的效果: 解析 这种效果主要通过text-align-last属性来实现. text-align-last:规定如何对 ...

  5. 纯css固定tbody高度,超出滚动效果

    <!DOCTYPE HTML> <html><head><meta http-equiv="Content-Type" content=& ...

  6. Urp渲染管线下的卡通冰效果实现

    一.卡通冰的效果 先看最终实现的卡通冰材质效果吧,如下所示: 也可以调出类似玻璃的效果: 如果对一个球应用卡通冰材质,然后打开各种选项,可以得到如下效果: 凹凸不平的地方是因为应用了法线贴图. 二.脚 ...

  7. 最强神作 Crysis深度剖析与优化指南

    题目:最强神作!Crysis深度剖析与优化指南 作者:小熊在线--WolStame 介绍:最强游戏Crysis全方位剖析与深度优化指南 关键:CRYSIS/DX10游戏/技术剖析/优化 原创:小熊在线 ...

  8. 最强神作!Crysis深度剖析与优化指南

    题目:最强神作!Crysis深度剖析与优化指南 作者:小熊在线--WolStame 介绍:最强游戏Crysis全方位剖析与深度优化指南 关键:CRYSIS/DX10游戏/技术剖析/优化 原创:小熊在线 ...

  9. 关于OGRE与OSG的简单比较

    关于OGRE与OSG的简单比较 林乃养 lnychina{at}gmail.com 浙江大学CAD&CG实验室 2010年3月27日 1 前言 我曾经细致阅读过OGRE和OSG官方提供的文档, ...

  10. 转:关于 OGRE 与 OSG 的简单比较

    1   前言 我曾经细致阅读过 OGRE 和 OSG 官方提供的文档,有<Pro OGRE 3D Programming>.OGRE自带手册(manual).王锐老师等翻译的<Ope ...

最新文章

  1. [异常笔记] spring boot 启动-2018040201
  2. C语言中static关键字的作用
  3. 如何对DevExpress ASPxGridView进行分组排序?
  4. c语言修仙受控可看吗,强推三本神奇到爆的小说,c语言修仙,程序员与修真会擦出什么火花...
  5. Yii的路由机制分析
  6. httpd设置HTTPS双向认证
  7. 理解SVG的viewport,viewBox【1】
  8. 【生物】基因编辑研究方向全面盘点,一文带你了解基因魔剪的前世今生
  9. opencv ORB特征匹配
  10. 喜马拉雅音频转mp3方法
  11. android imageview 半透明,如何将半透明视图叠加到ImageView上?
  12. 英雄无敌6服务器在哪个文件夹,win7系统英雄无敌6无法运行的解决方法
  13. 原创 和Taskmgr过不去篇(无厘头版)
  14. GIS数据漫谈(六)— 投影坐标系统
  15. UBOOT----基于itop4412开发板,从0开始,慢慢摸索UBOOT的启动流程和系统组织结构(一)
  16. java内部窗口无法实现,java 既不是内部命令也不是外部命令的解决办法
  17. 学术报告系列(八) - Fault-tolerant control of unmanned aerial vehicles
  18. 纯真ip数据库 转mysql_如何把纯真ip数据库导入到MySQL数据表中
  19. python槽格式里填啥_python 文件读与写详解
  20. 带宽的定义标准是什么

热门文章

  1. docker实践——从新镜像启动容器报错解决
  2. 整体绩效管理-整合企业绩效与人员绩效(zt)
  3. linux中cut批量提取,Linux中使用cut命令来提取文本的用法指南
  4. 人口预报:世界上最大的国家
  5. 2021-08-05 cf1549
  6. 基础 | date_range时间序列--时间切片
  7. Whole-cell segmentation of tissue images with human-level performance using large-scale data annotat
  8. ideal中使用git总结
  9. 通信原理板块——频分复用(FDM)
  10. 最烧脑的珠峰高程测算过程