[shader]灯光遮罩(水纹,散焦等)

本文介绍如何在Unity中使用Shader实现灯光遮罩效果,包括水纹和散焦等特效,通过理解基本原理和查看相关代码,可以掌握Shader在3D场景中的应用技巧。

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

效果


原理

利用灯光投射范围
利用法线RG偏移贴图

代码

Shader "QQ/LightWave"
{
	Properties
	{
		_Color("Color",Color) = (0,0,0,1)
		_MainTex("Texture", 2D) = "white" {}
		_WaveTex("Wave",2D) = "white" {}
		_BumpTex("Bump", 2D) = "white" {}
		_HeatForce("HeatForce",float) = 1
	}
		SubShader
		{
			Tags { "RenderType" = "Opaque" }
			LOD 100

			Pass
			{
				CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag
				#include "UnityCG.cginc"
				#pragma multi_compile_fog
				#pragma target 3.0
				struct a2v
				{
					float4 vertex : POSITION;
					float2 uv : TEXCOORD0;
				};

				struct v2f
				{
					float4 vertex : SV_POSITION;
					float2 uv: TEXCOORD0;
					UNITY_FOG_COORDS(1)
				};
				fixed4 _Color;
				sampler2D _MainTex;
				float4 _MainTex_ST;
				v2f vert(a2v v)
				{
					v2f o;
					o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
					o.uv = TRANSFORM_TEX(v.uv, _MainTex);
					UNITY_TRANSFER_FOG(o, o.vertex);
					return o;
				}

				fixed4 frag(v2f i) : SV_Target
				{
					fixed4 col = tex2D(_MainTex, i.uv)*_Color;
					UNITY_APPLY_FOG(i.fogCoord, col);
					return col;
				}
				ENDCG
			}
			Pass{

			Tags{"LightMode" = "ForwardAdd"}
			Blend One One
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#define UNITY_PASS_FORWARDADD
			#include "UnityCG.cginc"
			#include "AutoLight.cginc"
			#pragma multi_compile_fwdadd_fullshadows
			#pragma multi_compile_fog
			#pragma target 3.0
			struct a2v
				{
					float4 vertex : POSITION;
					float2 uv : TEXCOORD0;
					float3 normal:NORMAL;
				};

				struct v2f
				{
					float4 vertex : SV_POSITION;
					UNITY_FOG_COORDS(0)
					LIGHTING_COORDS(1, 2)
					float2 uv[2] : TEXCOORD3;
					float atten : Texcoord5;
				};
				float4 _LightColor0;
				sampler2D _WaveTex;
				sampler2D _BumpTex;
				float4 _WaveTex_ST;
				float4 _BumpTex_ST;
				float _HeatForce;
				v2f vert(a2v v)
				{
					v2f o;
					o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
					float4 wPos = mul(unity_ObjectToWorld,v.vertex);
					o.atten = max(0, dot(UnityObjectToWorldNormal(v.normal), UnityWorldSpaceLightDir(wPos)));
					_WaveTex_ST.zw *= _Time.x;
					_BumpTex_ST.zw *= _Time.x;
					o.uv[0] = TRANSFORM_TEX(v.uv, _WaveTex);
					o.uv[1] = TRANSFORM_TEX(v.uv, _BumpTex);
					UNITY_TRANSFER_FOG(o,o.vertex);
					TRANSFER_VERTEX_TO_FRAGMENT(o)
					return o;
				}

				fixed4 frag(v2f i) : SV_Target
				{
				i.uv[0] += tex2D(_BumpTex, i.uv[1]).rg*_HeatForce;
				fixed4 col = tex2D(_WaveTex, i.uv[0]);
				col *= i.atten*_LightColor0*LIGHT_ATTENUATION(i)*col.a;
				UNITY_APPLY_FOG(i.fogCoord, col);
				return col;
				}
			ENDCG
			}
		}
}


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值