很多Shader中都會定義RenderType這個類型,但是一直搞不明白到底是干嘛的,官方文檔是這樣結解釋的:Rendering with Replaced Shaders
Rendering with Replaced Shaders
shader通過camera中 Camera.RenderWithShader 和 Camera.SetReplacementShader實現替換功能,這兩個方法都接受兩個參數:Shader和replacementTag ,根據情況:
- replacementTag 為空,場景中所有物體都會使用replacement shader進行渲染
- replacementTag 不為空,如果物體不存在tag則不進行渲染。
- replacementTag 不為空,如果物體shgader中存在、與之placement shader中相同的tag',則使用placement shader中對應subshader進行渲染,否則不渲染。
RenderType類型
- Opaque: most of the shaders (Normal, Self Illuminated, Reflective, terrain shaders).
- Transparent: most semitransparent shaders (Transparent, Particle, Font, terrain additive pass shaders).
- TransparentCutout: masked transparency shaders (Transparent Cutout, two pass vegetation shaders).
- Background: Skybox shaders.
- Overlay: GUITexture, Halo, Flare shaders.
- TreeOpaque: terrain engine tree bark.
- TreeTransparentCutout: terrain engine tree leaves.
- TreeBillboard: terrain engine billboarded trees.
- Grass: terrain engine grass.
- GrassBillboard: terrain engine billboarded grass.
測試
- 隨便寫個兩個shader,建立對應的材質:
Shader "Unlit/BlueShader"
{
Properties
{
_Color("Color",Color) = (0,0,0,1)
}
SubShader
{
Tags { "RenderType"="transparent" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata {float4 vertex : POSITION;};
struct v2f{
float4 vertex : SV_POSITION;
};
fixed4 _Color ;
v2f vert (appdata v){
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);return o;
}
fixed4 frag (v2f i) : SV_Target{
fixed4 col = _Color;return col;
}
ENDCG
}
}
}
- 另一個shader與之相似,修改名字為"RedShader", 同時修改RenderType為"transparent":
Shader "Unlit/RedShader"
{
Properties
{
_Color("Color",Color) = (0,0,0,1)
}
SubShader
{
Tags { "RenderType"="transparent" }
pass
{}
}
}
- 建議一個Replacement shader,和rendshader相似,並將輸出顏色修改為固定黃色。之修改下名字:
Shader "Unlit/ReplacementShader"
{
Properties
{
_Color("Color",Color) = (0,0,0,1)
}
SubShader
{
Tags { "RenderType"="transparent" }
pass
{
...
//輸出為黃色,如果替換了輸出為黃色
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = fixed4(1,1,0,0);
return col;
}
...
}
}
}
- 寫一個相機上的腳本,在啟動時替換shader
public class ReplaceMent : MonoBehaviour {
public Shader rpShader;
// Use this for initialization
void Start ()
{
//全部替換渲染
//GetComponent<Camera> ().SetReplacementShader(rpShader,"");
//RenderType="rpShader中RenderType"的sunshader進行渲染,
GetComponent<Camera> ().SetReplacementShader(rpShader,"RenderType");
}
}
執行前
執行后
如果在SetReplacementShader函數中tag為空,則輸出為全黃色。
結論
- 不知道啥時候可以用到