Unity3d 真實的植物渲染


好久沒寫shader了,有些生疏,剛弄了個植物shader,分享一下。

先上圖片:


 

重點需要注意的是fragment shader的透明部分

需要如此聲明

		Tags{ "LightMode" = "ForwardBase" 		"Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout" }
		Cull Back
			ZWrite on
			Blend SrcAlpha OneMinusSrcAlpha

Queue隊列,決定渲染順序

    Background - 最初的渲染渲染,用來渲染天空盒或者背景
    Geometry - 默認值,一般的不透明物體
    AlphaTest - 渲染經過Alpha Test的像素
    Transparent - 渲染透明物體
    Overlay - 最后渲染的物體

"IgnoreProjector"="True"(不被Projectors影響)

 

關於renderType來自這里

Opaque: 用於大多數着色器(法線着色器、自發光着色器、反射着色器以及地形的着色器)。
Transparent:用於半透明着色器(透明着色器、粒子着色器、字體着色器、地形額外通道的着色器)。
TransparentCutout: 蒙皮透明着色器(Transparent Cutout,兩個通道的植被着色器)。
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. 地形引擎何中的廣告牌草。

 

這里需要注意的是透明的blend部分官方文檔可詳細查看,

但如果只這么寫透明部分會擋住后面的部分,我們還要在后面的代碼中加上discard,直接丟棄像素,這樣它就不會擋住后面的部分了,

			if (c.a<0.5)
				discard;



這里渲染的重點還是基於物理的渲染,之前有詳細寫過

 

由於資源里有兩種貼圖方案,我就寫了兩種shader進行了不同的計算

一種是specular Texture的一種是GlossTexture的

 

大芭蕉

<span style="font-size:14px;">			float3 cc = (c.rgb *(diff+0.2)*_Color*_Lum + all  * SpecC*_SC  * _SCP);
			return float4(cc * 2 + rim, c.a * (1 - Luminance(TransC) + _TL));</span>


 玉竹

			float3 cc = (c.rgb *(diff + 0.2)*_Color*_Lum + (all + 0.1)*(saturate(Luminance(SpecC)) + 0.1)*_SC*_SCP);
			return float4(cc * 2 + rim, c.a * (1 - Luminance(TransC) + _TL));

 

 

 

 

也可以引申一些更好玩的東西比如在vertex shader中寫入被風吹的效果

 

全部代碼以共享至GitHub

 

                                                       ----------   by wolf96

 



免責聲明!

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



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