unityshader 消融效果

代码,讲解都在注释上面了:
冯乐乐的《unity shader 入门精要》:
相关知识:

  • 透明度
  • 阴影计算
  • 普通光照
  • 法线贴图
Properties
	{
		_BurnAmount("BurnAmount",Range(0,1)) = 0
		_LineWidth("LineWidth",Range(0,0.2)) = 0.1
		_MainTex("MainTex",2D) = "white"{}
		_BumpMap("BumpMap",2D) = "white"{}
		_BumpFirstColor("BumpFirstColor",Color) = (1,1,1,1)
		_BumpSencondColor("BumpSencondColor",Color) = (1,1,1,1)
		_BurnMap("BurnMap",2D) = "white"{}
	}
	SubShader
	{
		pass {
				Tags{"LightMode" = "ForwardBase"}
				Cull Off
				//cg语言开始编写
				CGPROGRAM

				//片段程序
				#pragma fragment frag
				#pragma multi_compile_fwdbase

				struct Output {
						float4 pos:POSITION;
						float2 uvMainTex:TEXCOORD0;
						float2 uvBumpMap:TEXCOORD1;
						float2 uvBurnMap:TEXCOORD2;
						float3 lightDir:TEXCOORD3;
						float3 worldPos:TEXCOORD4;
						//阴影
						SHADOW_COORDS(5)
				};
				Output vert(Input v)
				{
					Output o;
					o.pos = UnityObjectToClipPos(v.vertex);
					o.uvMainTex = TRANSFORM_TEX(v.uv, _MainTex);
					o.uvBumpMap = TRANSFORM_TEX(v.uv, _BumpMap);
					o.uvBurnMap = TRANSFORM_TEX(v.uv, _BurnMap);
					//切线空间转换rotation
					TANGENT_SPACE_ROTATION;
					o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex));
					o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
					//阴影计算
					TRANSFER_SHADOW(o);
					return o;
				}
				fixed4 frag(Output i) :SV_Target
				{
					fixed4 burn = tex2D(_BurnMap,i.uvBurnMap);
					//为了全部剪除,需要对burn.a - _BurnAmount进行差值判断
					float val = burn.a - _BurnAmount < 0.01 ? -1 : burn.a - _BurnAmount;
					//裁剪
					clip(val);
					//采样物体本身纹理图
					float3 albedo = tex2D(_MainTex, i.uvMainTex).xyz;

					//计算切线空间数据
					float3 tangentLight = normalize(i.lightDir);
					float3 tangentNormal = UnpackNormal(tex2D(_BumpMap, i.uvBumpMap));
					//环境光
					fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz*albedo;
					//切线空间下的漫反射,也可以自己添加镜面高光,为了法线贴图
					fixed3 diff = _LightColor0.rgb*albedo*max(0, dot(tangentLight, tangentNormal));

					//裁剪边缘的颜色区域宽度
					fixed t = 1 - smoothstep(0, _LineWidth, burn.a - _BurnAmount);
					fixed3 burnColor = lerp(_BumpFirstColor, _BumpSencondColor, t);
					burnColor = pow(burnColor, 5);

					//阴影计算atten
					UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);

					fixed3 finalColor = lerp(ambient + diff * atten, burnColor, t*step(0.0001, _BurnAmount));

					return fixed4(finalColor, 1);
				}
				ENDCG
		}
		//可以试着将这个pass注释掉,看效果,会发现阴影没有随着裁剪而变化
		pass{
			
		Tags{"LightMode" = "ShadowCaster"}
			//cg语言开始编写
			CGPROGRAM

			//片段程序
			#pragma fragment frag
			#pragma multi_compile_shadowcaster
			struct Output {
				V2F_SHADOW_CASTER;
				float2 uvBurnMap:TEXCOORD2;
			};
			Output vert(Input v)
			{
				Output o;
				TRANSFER_SHADOW_CASTER_NORMALOFFSET(o);
				o.uvBurnMap = TRANSFORM_TEX(v.uv, _BurnMap);
				return o;
			}
			fixed4 frag(Output i) :SV_Target
			{	
				fixed4 burn = tex2D(_BurnMap,i.uvBurnMap);
				float val = burn.a - _BurnAmount < 0.01 ? -1 : burn.a - _BurnAmount;
				clip(val);
				SHADOW_CASTER_FRAGMENT(i)//投射阴影
			}
			ENDCG
		}

			CGINCLUDE

				//在逻辑中申明顶点和片段://编译申明函数
				//顶点程序
				#pragma vertex vert
				#include "Lighting.cginc"
				#include "AutoLight.cginc"
				#include "UnityCG.cginc"
				struct Input {
					float4 vertex:POSITION;
					float2 uv:TEXCOORD0;
					float3 normal:NORMAL;
					float4 tangent:TANGENT;
				};
				
				sampler2D _MainTex;
				float4 _MainTex_ST;
				sampler2D _BumpMap;
				float4 _BumpMap_ST;
				sampler2D _BurnMap;
				float4 _BurnMap_ST;

				float _BurnAmount;
				float _LineWidth;
				float4 _BumpFirstColor;
				float4 _BumpSencondColor;
				
			ENDCG

	}
	 FallBack "Specular"//影子

效果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!要在Unity中实现椭圆形消融效果,可以通过编写自定义的着色器(Shader)来实现。下面是一个简单的示例代码,可以将该代码放在一个名为"EllipticalDissolve"的着色器文件中: ``` Shader "Custom/EllipticalDissolve" { Properties { _MainTex ("Texture", 2D) = "white" {} _DissolveParams ("Dissolve Parameters", Vector) = (0, 0, 0, 0) } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent"} Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _DissolveParams; v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag(v2f i) : SV_Target { // 计算像素到中心点的距离 float2 center = _DissolveParams.xy; float2 uvPosition = i.uv - center; uvPosition *= float2(_ScreenParams.w / _ScreenParams.z, 1); float distance = length(uvPosition); // 计算椭圆形的半径 float2 ellipseRadius = _DissolveParams.zw * 0.5; // 根据距离和椭圆形半径,控制像素的透明度 float alpha = smoothstep(ellipseRadius.x, ellipseRadius.y, distance); // 根据透明度混合原始纹理和背景色 fixed4 texColor = tex2D(_MainTex, i.uv); fixed4 bgColor = fixed4(0, 0, 0, 1); // 背景色可以根据需要进行调整 fixed4 finalColor = lerp(texColor, bgColor, alpha); return finalColor; } ENDCG } } } ``` 使用该着色器时,需要设置"_DissolveParams"参数来控制椭圆形的位置和大小。其中,"_DissolveParams"的x和y分量表示椭圆形的中心点坐标(范围为0到1),而z和w分量则表示椭圆形的x轴和y轴半径(同样范围为0到1)。 你可以在材质上应用这个自定义着色器,并在脚本中更新"_DissolveParams"参数来实现椭圆形消融效果。希望这能帮到你!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值