找回密码
 立即注册
查看: 166|回复: 0

《Unity Shader 入门精要》从Bulit-in 到URP (HLSL)Chapter15.3-基于噪声纹理的全局雾效

[复制链接]
发表于 2024-7-15 18:02 | 显示全部楼层 |阅读模式
前言:
已经进入“高级篇”啦,但愿大师多多撑持,多多存眷,这将对我发生非常愉悦的正反馈~

“《Unity Shader 入门精要》从Bulit-in 到URP”是一个辅佐Unity Shader学习者以冯乐乐女神《Unity Shader 入门精要》为基础学习用HLSL语言编写URP着色器的案例教学系列。

作者自学能力有限,抛砖引玉,如有建议和问题请各位大佬和同仁交流斧正。
Bulit-in版:
  1. // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
  2. Shader ”Unity Shaders Book/Chapter 15/Fog With Noise” {
  3.         Properties {
  4.                 _MainTex (”Base (RGB)”, 2D) = ”white” {}
  5.                 _FogDensity (”Fog Density”, Float) = 1.0
  6.                 _FogColor (”Fog Color”, Color) = (1, 1, 1, 1)
  7.                 _FogStart (”Fog Start”, Float) = 0.0
  8.                 _FogEnd (”Fog End”, Float) = 1.0
  9.                 _NoiseTex (”Noise Texture”, 2D) = ”white” {}
  10.                 _FogXSpeed (”Fog Horizontal Speed”, Float) = 0.1
  11.                 _FogYSpeed (”Fog Vertical Speed”, Float) = 0.1
  12.                 _NoiseAmount (”Noise Amount”, Float) = 1
  13.         }
  14.         SubShader {
  15.                 CGINCLUDE
  16.                
  17.                 #include ”UnityCG.cginc”
  18.                
  19.                 float4x4 _FrustumCornersRay;
  20.                
  21.                 sampler2D _MainTex;
  22.                 half4 _MainTex_TexelSize;
  23.                 sampler2D _CameraDepthTexture;
  24.                 half _FogDensity;
  25.                 fixed4 _FogColor;
  26.                 float _FogStart;
  27.                 float _FogEnd;
  28.                 sampler2D _NoiseTex;
  29.                 half _FogXSpeed;
  30.                 half _FogYSpeed;
  31.                 half _NoiseAmount;
  32.                
  33.                 struct v2f {
  34.                         float4 pos : SV_POSITION;
  35.                         float2 uv : TEXCOORD0;
  36.                         float2 uv_depth : TEXCOORD1;
  37.                         float4 interpolatedRay : TEXCOORD2;
  38.                 };
  39.                
  40.                 v2f vert(appdata_img v) {
  41.                         v2f o;
  42.                         o.pos = UnityObjectToClipPos(v.vertex);
  43.                        
  44.                         o.uv = v.texcoord;
  45.                         o.uv_depth = v.texcoord;
  46.                        
  47.                         #if UNITY_UV_STARTS_AT_TOP
  48.                         if (_MainTex_TexelSize.y < 0)
  49.                                 o.uv_depth.y = 1 - o.uv_depth.y;
  50.                         #endif
  51.                        
  52.                         int index = 0;
  53.                         if (v.texcoord.x < 0.5 && v.texcoord.y < 0.5) {
  54.                                 index = 0;
  55.                         } else if (v.texcoord.x > 0.5 && v.texcoord.y < 0.5) {
  56.                                 index = 1;
  57.                         } else if (v.texcoord.x > 0.5 && v.texcoord.y > 0.5) {
  58.                                 index = 2;
  59.                         } else {
  60.                                 index = 3;
  61.                         }
  62.                         #if UNITY_UV_STARTS_AT_TOP
  63.                         if (_MainTex_TexelSize.y < 0)
  64.                                 index = 3 - index;
  65.                         #endif
  66.                        
  67.                         o.interpolatedRay = _FrustumCornersRay[index];
  68.                                           
  69.                         return o;
  70.                 }
  71.                
  72.                 fixed4 frag(v2f i) : SV_Target {
  73.                         float linearDepth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv_depth));
  74.                         float3 worldPos = _WorldSpaceCameraPos + linearDepth * i.interpolatedRay.xyz;
  75.                        
  76.                         float2 speed = _Time.y * float2(_FogXSpeed, _FogYSpeed);
  77.                         float noise = (tex2D(_NoiseTex, i.uv + speed).r - 0.5) * _NoiseAmount;
  78.                                        
  79.                         float fogDensity = (_FogEnd - worldPos.y) / (_FogEnd - _FogStart);
  80.                         fogDensity = saturate(fogDensity * _FogDensity * (1 + noise));
  81.                        
  82.                         fixed4 finalColor = tex2D(_MainTex, i.uv);
  83.                         finalColor.rgb = lerp(finalColor.rgb, _FogColor.rgb, fogDensity);
  84.                        
  85.                         return finalColor;
  86.                 }
  87.                
  88.                 ENDCG
  89.                
  90.                 Pass {                 
  91.                         CGPROGRAM  
  92.                        
  93.                         #pragma vertex vert  
  94.                         #pragma fragment frag  
  95.                           
  96.                         ENDCG
  97.                 }
  98.         }
  99.         FallBack Off
  100. }
复制代码
URP版:

Unity项目源码:
  1. Shader ”Unlit/Chapter15-FogWithNoise”
  2. {
  3.     Properties {
  4.                 _MainTex (”Base (RGB)”, 2D) = ”white” {}
  5.                 _FogDensity (”Fog Density”, Float) = 1.0
  6.                 _FogColor (”Fog Color”, Color) = (1, 1, 1, 1)
  7.                 _FogStart (”Fog Start”, Float) = 0.0
  8.                 _FogEnd (”Fog End”, Float) = 1.0
  9.                 _NoiseTex (”Noise Texture”, 2D) = ”white” {}
  10.                 _FogXSpeed (”Fog Horizontal Speed”, Float) = 0.1
  11.                 _FogYSpeed (”Fog Vertical Speed”, Float) = 0.1
  12.                 _NoiseAmount (”Noise Amount”, Float) = 1
  13.         }
  14.     SubShader {
  15.         Tags {”RenderPipeline” = ”UniversalPipeline”}
  16.                 HLSLINCLUDE
  17.                
  18.                 #include ”Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl”
  19.                 #include ”Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl”
  20.         CBUFFER_START(UnityPerMaterial)
  21.             half4 _MainTex_TexelSize;
  22.             half _FogDensity;
  23.             half4 _FogColor;
  24.             float _FogStart;
  25.             float _FogEnd;
  26.             half _FogXSpeed;
  27.             half _FogYSpeed;
  28.             half _NoiseAmount;
  29.             float4x4 _FrustumCornersRay;
  30.         CBUFFER_END
  31.                        
  32.                         TEXTURE2D(_MainTex);                           SAMPLER(sampler_MainTex);
  33.             TEXTURE2D(_CameraDepthTexture);                SAMPLER(sampler_CameraDepthTexture);
  34.             TEXTURE2D(_NoiseTex);                          SAMPLER(sampler_NoiseTex);
  35.                
  36.         struct appdata{
  37.             float4 vertex : POSITION;
  38.             float2 texcoord : TEXCOORD0;
  39.         };
  40.                 struct v2f {
  41.                         float4 pos : SV_POSITION;
  42.                         float2 uv : TEXCOORD0;
  43.                         float2 uv_depth : TEXCOORD1;
  44.                         float4 interpolatedRay : TEXCOORD2;
  45.                 };
  46.                
  47.                 v2f vert(appdata v) {
  48.                         v2f o;
  49.                         o.pos = TransformObjectToHClip(v.vertex);
  50.                        
  51.                         o.uv = v.texcoord;
  52.                         o.uv_depth = v.texcoord;
  53.                        
  54.                         #if UNITY_UV_STARTS_AT_TOP
  55.                         if (_MainTex_TexelSize.y < 0)
  56.                                 o.uv_depth.y = 1 - o.uv_depth.y;
  57.                         #endif
  58.                        
  59.                         int index = 0;
  60.                         if (v.texcoord.x < 0.5 && v.texcoord.y < 0.5) {
  61.                                 index = 0;
  62.                         } else if (v.texcoord.x > 0.5 && v.texcoord.y < 0.5) {
  63.                                 index = 1;
  64.                         } else if (v.texcoord.x > 0.5 && v.texcoord.y > 0.5) {
  65.                                 index = 2;
  66.                         } else {
  67.                                 index = 3;
  68.                         }
  69.                         #if UNITY_UV_STARTS_AT_TOP
  70.                         if (_MainTex_TexelSize.y < 0)
  71.                                 index = 3 - index;
  72.                         #endif
  73.                        
  74.                         o.interpolatedRay = _FrustumCornersRay[index];
  75.                                           
  76.                         return o;
  77.                 }
  78.                
  79.                 half4 frag(v2f i) : SV_Target {
  80.                         float linearDepth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, sampler_CameraDepthTexture, i.uv_depth), _ZBufferParams);
  81.                         float3 worldPos = _WorldSpaceCameraPos + linearDepth * i.interpolatedRay.xyz;
  82.                        
  83.                         float2 speed = _Time.y * float2(_FogXSpeed, _FogYSpeed);
  84.                         float noise = (SAMPLE_TEXTURE2D(_NoiseTex, sampler_NoiseTex, i.uv + speed).r - 0.5) * _NoiseAmount;
  85.                                        
  86.                         float fogDensity = (_FogEnd - worldPos.y) / (_FogEnd - _FogStart);
  87.                         fogDensity = saturate(fogDensity * _FogDensity * (1 + noise));
  88.                        
  89.                         half4 finalColor = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
  90.                         finalColor.rgb = lerp(finalColor.rgb, _FogColor.rgb, fogDensity);
  91.                        
  92.                         return finalColor;
  93.                 }
  94.                
  95.                 ENDHLSL
  96.                
  97.                 Pass {                 
  98.                         HLSLPROGRAM  
  99.                        
  100.                         #pragma vertex vert  
  101.                         #pragma fragment frag  
  102.                           
  103.                         ENDHLSL
  104.                 }
  105.         }
  106.         FallBack ”Packages/com.unity.render-pipelines.universal/FallbackError”
  107. }
复制代码
效果图:



如有收获,请留下“存眷”和“附和”

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-12-22 10:54 , Processed in 0.101073 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表