核心内容摘要
锦上添花的温柔旅程
(
(
把 Scene_12_6另存为 Scene_13_3(
(
(
(
https://github.com/candycat1992/Unity_Shaders_Book/blob/master/Assets/Scripts/Chapter13/FogWithDepthTexture.csusing UnityEngine; using System.Collections; public class FogWithDepthTexture : PostEffectsBase { public Shader fogShader; public Material fogMaterial null; public Material material { get { fogMaterial CheckShaderAndCreateMaterial(fogShader, fogMaterial); return fogMaterial; } } private Camera myCamera; public Camera camera { get { if (myCamera null) { myCamera GetComponentCamera(); } return myCamera; } } private Transform myCameraTransform; public Transform cameraTransform { get { if (myCameraTransform null ) { myCameraTransform camera.transform; } return myCameraTransform; } } [Range(
0f,
0f)] public float fogDensity
0f; //控制雾的浓度 public Color fogColor Color.white; //控制雾的颜色 public float fogStart
0f; //控制雾效的起始高度 public float fogEnd
0f; //控制雾效的终止高度 void OnEnable() { camera.depthTextureMode | DepthTextureMode.Depth; } //获取摄像机的深度纹理 void OnRenderImage (RenderTexture src, RenderTexture dest) { if (material ! null) { Matrix4x4 frustumCorners Matrix4x
identity; float fov camera.fieldOfView; float near camera.nearClipPlane; float aspect camera.aspect; float halfHeight near * Mathf.Tan(fov *
5f * Mathf.D
Rad); Vector3 toRight cameraTransform.right * halfHeight * aspect; Vector3 toTop cameraTransform.up * halfHeight; Vector3 topLeft cameraTransform.forward * near toTop - toRight; float scale topLeft.magnitude / near; topLeft.Normalize(); topLeft * scale; Vector3 topRight cameraTransform.forward * near toRight toTop; topRight.Normalize(); topRight * scale; Vector3 bottomLeft cameraTransform.forward * near - toTop - toRight; bottomLeft.Normalize(); bottomLeft * scale; Vector3 bottomRight cameraTransform.forward * near toRight - toTop; bottomRight.Normalize(); bottomRight * scale; frustumCorners.SetRow(0, bottomLeft); frustumCorners.SetRow(1, bottomRight); frustumCorners.SetRow(2, topRight); frustumCorners.SetRow(3, topLeft); material.SetMatrix(_FrustumCornersRay, frustumCorners); material.SetFloat(_FogDensity, fogDensity); material.SetColor(_FogColor, fogColor); material.SetFloat(_FogStart, fogStart); material.SetFloat(_FogEnd, fogEnd); Graphics.Blit (src, dest, material); } else { Graphics.Blit(src, dest); } } }Shader Custom/Chapter13-FogWithDepthTexture { Properties { _MainTex (Base (RGB), 2D) white {} _FogDensity (Fog Density, Float)
0 _FogColor (Fog Color, Color) (1, 1, 1,
_FogStart (Fog Start, Float)
0 _FogEnd (Fog End, Float)
0 } SubShader { CGINCLUDE #include UnityCG.cginc float4x4 _FrustumCornersRay; sampler2D _MainTex; half4 _MainTex_TexelSize; sampler2D _CameraDepthTexture; half _FogDensity; fixed4 _FogColor; float _FogStart; float _FogEnd; struct v2f { float4 pos : SV_POSITION; half2 uv : TEXCOORD0; half2 uv_depth : TEXCOORD1; float4 interpolatedRay : TEXCOORD2; }; v2f vert(appdata_img v) { v2f o; o.pos mul(UNITY_MATRIX_MVP, v.vertex); o.uv v.texcoord; o.uv_depth v.texcoord; #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y
o.uv_depth.y 1 - o.uv_depth.y; #endif int index 0; if (v.texcoord.x
5 v.texcoord.y
0.
{ index 0; } else if (v.texcoord.x
5 v.texcoord.y
0.
{ index 1; } else if (v.texcoord.x
5 v.texcoord.y
0.
{ index 2; } else { index 3; } #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y
index 3 - index; #endif o.interpolatedRay _FrustumCornersRay[index]; return o; } fixed4 frag(v2f i) : SV_Target { float linearDepth LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv_depth)); float3 worldPos _WorldSpaceCameraPos linearDepth * i.interpolatedRay.xyz; float fogDensity (_FogEnd - worldPos.y) / (_FogEnd - _FogStart); fogDensity saturate(fogDensity * _FogDensity); fixed4 finalColor tex2D(_MainTex, i.uv); finalColor.rgb lerp(finalColor.rgb, _FogColor.rgb, fogDensity); return finalColor; } ENDCG Pass { ZTest Always Cull Off ZWrite Off CGPROGRAM #pragma vertex vert #pragma fragment frag ENDCG } } FallBack Off }(
《Unity Shader》
1