Unity Shader 基礎(1): RenderType & ReplacementShader


很多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類型

  1. Opaque: most of the shaders (Normal, Self Illuminated, Reflective, terrain shaders).
  2. Transparent: most semitransparent shaders (Transparent, Particle, Font, terrain additive pass shaders).
  3. TransparentCutout: masked transparency shaders (Transparent Cutout, two pass vegetation shaders).
  4. Background: Skybox shaders.
  5. Overlay: GUITexture, Halo, Flare shaders.
  6. TreeOpaque: terrain engine tree bark.
  7. TreeTransparentCutout: terrain engine tree leaves.
  8. TreeBillboard: terrain engine billboarded trees.
  9. Grass: terrain engine grass.
  10. GrassBillboard: terrain engine billboarded grass.

測試

  1. 隨便寫個兩個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
		}
	}
}
  1. 另一個shader與之相似,修改名字為"RedShader", 同時修改RenderType為"transparent":
Shader "Unlit/RedShader"
{
	Properties
	{
		_Color("Color",Color) = (0,0,0,1)
	}
	SubShader
	{
		Tags { "RenderType"="transparent" }
		pass
		{}	
	}
}
  1. 建議一個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;
			}
			...
		}	
	}
}
  1. 寫一個相機上的腳本,在啟動時替換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");
	}
}

執行前
mark
執行后
mark

如果在SetReplacementShader函數中tag為空,則輸出為全黃色。

結論

  1. 不知道啥時候可以用到

引用

  1. unity 替換渲染 ( Rendering with Replaced Shaders )
  2. 官方文檔
  3. 淺析Unity shader中RenderType的作用及_CameraDepthNormalsTexture


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM