用Ogre固定渲染管線實現火炬之光X-RAY效果

 遊戲的遮擋半透,一般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,我們用固定渲染管線...

 

代碼

 由於公司的一些原因,代碼只好取消了,前一週我是提供了代碼的.見諒

 

第一步,初始化上面這個類:

 

第二步:更改Ogre源碼,因爲Ogre有個bug,調用_suppressRenderStateChanges以後,不會去渲染不接受陰影的對象

找個這個函數renderBasicQueueGroupObjects.改成如下:

 

另外,合成器的源碼也要小改,合成器鏈有個隊列監聽,那個監聽在某些時候會跳過我們的隊列,導致合成器的問題,不能讓他跳過隊列所以

 

第三步:記得設置渲染隊列

RENDER_QUEUE_3  -->要半透的建築隊列

RENDER_QUEUE_4  -->玩家隊列

RENDER_QUEUE_MAIN -->不透的建築隊列

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

最後效果,顏色可能還要調試下

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章