遊戲的遮擋半透,一般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 -->不透的建築隊列
-------------------------------------------------------------------------------------------------
最後效果,顏色可能還要調試下