Unity材質替代渲染相關:RenderWithShader & SetReplacementShader

Unity材質替代渲染相關:RenderWithShader & SetReplacementShader

概要

Unity提供了使用Camera實現場景中物體替換shader渲染的方法,來滿足一些特殊需求。

public void RenderWithShader(Shader shader, string replacementTag);
public void SetReplacementShader(Shader shader, string replacementTag);

兩種方法都在掛載在Camera上的腳本上調用,其中RenderWithShader 方法調用一次之後只渲染場景一次,SetReplacementShader方法調用之後會一直使用,直到調用ResetReplacementShader方法,則恢復所有物體的正常渲染。

RenderWithShader

官方文檔解釋鏈接(v:2018.4)
英文不好,個人大概理解爲使用這個方法的相機不能是你當前正在使用的渲染的相機,你需要一個新的相機,並且disable掉掛載的Camera組件,這個相機不會再發送OnPreCull, OnPreRender or OnPostRender 消息,最好結合RenderTexture使用。所以我使用它的方法基本就是將它作爲一種觸發性質的渲染方式,在你需要的時候調用一次渲染方法,渲染到RenderTexture並進行使用。

GetComponent<Camera>().RenderWithShader(usedShader, replaceTag);

SetReplacementShader

官方文檔解釋鏈接(v:2018.4)
這個要比上面的方法好用一些,它是一種狀態控制方式,調用一次之後,該相機會一直採用參數中的着色器進行場景物體渲染,使用ResetReplacementShader方法停止狀態。可以直接在週期方法中調用。

*GetComponent<Camera>().SetReplacementShader(usedShader, replaceTag);

關於UsedShader和ReplaceTag的解釋

UsedShader很簡單,就是你想要渲染物體使用的着色器,用它來替換原來場景中的物體的着色器(只是用來渲染,並非真的替換)。

ReplaceTag則是Shader中SubShader使用的Tags標籤,例如:

		SubShader{
		Tags{ "Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout" }
		Pass{……}
		}

在物體原着色器中的SubShader的tags中的鍵值對和相機替換使用的着色器SubShader的tags中的鍵值對進行匹配(鍵值對應都要相同,只要有一對SubShader滿足即可),如果匹配成功,則該物體使用對應替換shader的Subshader進行渲染,其他任何情況該物體都不會渲染。例如:

相機替換用:

Tags { "RenderType"="TransparentCutout"}

物體原着色器:

Tags{ "Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout" }

則替換成功。
—————————————————————————————————————————————————————————————
相機替換用:

Tags { "RenderType"="Transparent"}

物體原着色器:

Tags{ "Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout" }

則替換失敗。

SetReplacementShader實踐結果,左邊Scene視圖下,物體正常渲染;右側Game視圖下相機替代渲染,正方體未通過,球體通過並替換渲染方式,失去描邊
實踐結果
而且tags鍵值對可以自行設置

另外,關於shader的屬性設置問題,比如貼圖等,只要替換前和替換後的着色器參數名相同,則替換前着色器的屬性信息會自動傳到替換後着色器當中。

暫時先寫到這,有些浮於表面,希望以後研究的更清楚一些……

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