Unity Shader总结(十五)——噪声(火焰、水面、缥缈雾效)

本文详细介绍了如何使用Unity Shader实现三种视觉效果:物体表面的消融效果,水面波动的水波效果,以及缥缈的雾效。通过调整Shader代码,控制噪声纹理和法线变化,模拟了火焰燃烧、水的流动和雾的扩散。这些效果的实现涉及到了纹理采样、法线映射、环境光照、折射反射等关键技术,为游戏和虚拟现实场景增添了丰富的视觉体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

消融效果

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Unity Shaders Book/Chapter 15/Dissolve" {
   
	Properties {
   
		_BurnAmount ("Burn Amount", Range(0.0, 1.0)) = 0.0 //控制消融程度,值越大,消融程度越明显
		_LineWidth("Burn Line Width", Range(0.0, 0.2)) = 0.1 //控制模拟消融程度时的线宽,值越大,火焰边缘蔓延的范围越广
		_MainTex ("Base (RGB)", 2D) = "white" {
   }
		_BumpMap ("Normal Map", 2D) = "bump" {
   }
		//火焰边缘的两种颜色值
		_BurnFirstColor("Burn First Color", Color) = (1, 0, 0, 1)
		_BurnSecondColor("Burn Second Color", Color) = (1, 0, 0, 1)
		_BurnMap("Burn Map", 2D) = "white"{
   } //噪声纹理
	}
	SubShader {
   
		Tags {
    "RenderType"="Opaque" "Queue"="Geometry"}
		
		Pass {
   
			Tags {
    "LightMode"="ForwardBase" }
			//因为消融要看见物体内部构造,所以全部渲染
			Cull Off
			
			CGPROGRAM
			
			#include "Lighting.cginc"
			#include "AutoLight.cginc"
			
			#pragma multi_compile_fwdbase
			
			#pragma vertex vert
			#pragma fragment frag
			
			fixed _BurnAmount;
			fixed _LineWidth;
			sampler2D _MainTex;
			sampler2D _BumpMap;
			fixed4 _BurnFirstColor;
			fixed4 _BurnSecondColor;
			sampler2D _BurnMap;
			
			float4 _MainTex_ST;
			float4 _BumpMap_ST;
			float4 _BurnMap_ST;
			
			struct a2v {
   
				float4 vertex : POSITION;
				float3 normal : NORMAL;
				float4 tangent : TANGENT;
				float4 texcoord : TEXCOORD0;
			};
			
			struct v2f {
   
				float4 pos : SV_POSITION;
				float2 uvMainTex : TEXCOORD0;
				float2 uvBumpMap : TEXCOORD1;
				float2 uvBurnMap : TEXCOORD2;
				float3 lightDir : TEXCOORD3;
				float3 worldPos : TEXCOORD4;
				SHADOW_COORDS(5)
			};
			
			v2f vert(a2v v) {
   
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				//计算三张纹理的纹理坐标
				o.uvMainTex = TRANSFORM_TEX(v.texcoord, _MainTex);
				o.uvBumpMap = TRANSFORM_TEX(v.texcoord, _BumpMap);
				o.uvBurnMap = TRANSFORM_TEX(v.texcoord, _BurnMap);
				//变换到切线空间
				TANGENT_SPACE_ROTATION;
  				o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex)).xyz;
  				
  				o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
  				
  				TRANSFER_SHADOW(o);
				
				return o;
			}
			
			fixed4 frag(v2f i) : SV_Target {
   
				//对噪声采样,和阈值相减后小于0时就会剔除该像素
				fixed3 burn = tex2D(_BurnMap, i.uvBurnMap).rgb;
				
				clip(burn.r - _BurnAmount);
				//剩下的像素进行光照计算
				float3 tangentLightDir = normalize(i.lightDir);
				fixed3 tangentNormal = UnpackNormal(tex2D(_BumpMap, i.uvBumpMap));
				
				fixed3 albedo = tex2D(_MainTex, i.uvMainTex).rgb;
				
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
				
				fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(tangentNormal, tangentLightDir));
				//计算烧焦颜色,在宽度_LineWidth内模拟颜色变化,t为1时,说明该像素位于消融的边界处,t为0时说明该像素为正常颜色,中间插值模拟烧焦效果
				fixed t = 1 - smoothstep(0.0, _LineWidth, burn.r - _BurnAmount);
				fixed3 burnColor = lerp(_BurnFirstColor, _BurnSecondColor, t);
				burnColor = pow(burnColor, 5); //pow函数使效果更像烧焦颜色
				
				UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);
				//_Burn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值