1. 程式人生 > >Unity3D之高級渲染-Shader Forge增強版

Unity3D之高級渲染-Shader Forge增強版

target body pil 就會 自己 ng-click orm VR https

筆者介紹:姜雪偉,IT公司技術合夥人,IT高級講師,CSDN社區專家。特邀編輯。暢銷書作者,國家專利發明人;已出版書籍:《手把手教你架構3D遊戲引擎》電子工業出版社和《Unity3D實戰核心技術具體解釋》電子工業出版社等。

CSDN視頻網址:http://edu.csdn.net/lecturer/144

大家了解了Shader Forge的制作原理,也會使用Shader Forge制作渲染材質了,在實際項目開發中,我們會遇到各種各樣的問題。有時候我們須要使用Shader Forge渲染的物體跟我們自己寫的Shader相互配合才幹起到作用。在配合的過程中就會遇到問題,以下就把筆者在項目開發中遇到的問題以及解決方式給讀者介紹一下。

我們使用Shade Forge渲染了一個金屬盔甲,這個金屬盔甲裏面另一個透明的人頭,渲染效果例如以下所看到的:

技術分享圖片

人臉使用的是帶有Alpha通道的Shader處理,在轉動的過程中,會出現人臉遮擋不住模型的情況,這樣看起來就非常怪異,效果例如以下所看到的:

技術分享圖片

上圖箭頭指示的地方沒有被透明的人臉遮擋住。人臉渲染使用的Shader例如以下所看到的:

Shader "Unlit/Transparent_Test" {
Properties {
	_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
}

SubShader {
	Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
	LOD 100
	
	//ZWrite Off
	Blend SrcAlpha OneMinusSrcAlpha 
	
	Pass {  
		CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma target 2.0
			#pragma multi_compile_fog
			
			#include "UnityCG.cginc"

			struct appdata_t {
				float4 vertex : POSITION;
				float2 texcoord : TEXCOORD0;
			};

			struct v2f {
				float4 vertex : SV_POSITION;
				half2 texcoord : TEXCOORD0;
				UNITY_FOG_COORDS(1)
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			
			v2f vert (appdata_t v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
				UNITY_TRANSFER_FOG(o,o.vertex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.texcoord);
				UNITY_APPLY_FOG(i.fogCoord, col);
				return col;
			}
		ENDCG
	}
}

}
這個Shader也是Unity3D自帶的Shader。僅僅是改動了一下文件名稱字,為了能讓透明的人臉遮住那半邊盔甲。該怎樣改動?

Unity3D引擎為我們提供了渲染順序,事實上出現這個情況的主要問題也是渲染順序問題。非常明顯是先渲染盔甲,再渲染透明的臉。

問題找到了。接下來須要改動渲染順序。就是先渲染透明的人臉材質。再渲染金屬盔甲。這樣就能夠實現遮擋關系了,再原有Shader的基礎上改動例如以下:

Shader "Unlit/Transparent_Test" {
Properties {
	_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
}

SubShader {
	Tags {"Queue"="Transparent-2000
" "IgnoreProjector"="True" "RenderType"="Transparent"} LOD 100 //ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 2.0 #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata_t { float4 vertex : POSITION; float2 texcoord : TEXCOORD0; }; struct v2f { float4 vertex : SV_POSITION; half2 texcoord : TEXCOORD0; UNITY_FOG_COORDS(1) }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata_t v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.texcoord); UNITY_APPLY_FOG(i.fogCoord, col); return col; } ENDCG } } }

見上面代碼的粗體部分,這樣改動後將其掛到人臉的模型上,再看一下效果:

技術分享圖片

這樣我們就攻克了問題。是不是非常easy?事實上Shader編程沒有想象的那麽難。僅僅要細心分析就能夠得到想要的效果,所以學習Unity Shader編程一定要深入進去。





Unity3D之高級渲染-Shader Forge增強版