shader之——冰冻

网上看到了一些冰冻的模型 不太适合移动端,所以优化了一下,在次记录一下

 

 

Shader "KriptoFX/RFX4/Decal/IceMobile" {
	Properties{
			_Color("Main Color", Color) = (1,1,1,1)
			[HDR]_ReflectColor("Reflection Color", Color) = (1,1,1,0.5)
			_MainTex("Base (RGB) Emission Tex (A)", 2D) = "white" {}
			_Cube("Reflection Cubemap", Cube) = "" {}
			_BumpMap("Normalmap", 2D) = "bump" {}
			_Cutoff("Cutoff", Range(0, 1)) = 0.5
			_Alpha ("Alpha",range(0,1)) = 0
	}

	   SubShader{
				Pass{
				Tags{ "Queue" = "Transparent"  }
					Blend SrcAlpha OneMinusSrcAlpha
					Cull Back
					ZWrite Off

				CGPROGRAM


				#pragma vertex vert
				#pragma fragment frag
				#include "UnityCG.cginc"
				struct appdata_t {
				float4 vertex : POSITION;
				float2 texcoord: TEXCOORD0;
				half4 color : COLOR;
				float3 normal : NORMAL;
				
			};

			struct v2f {
				float4 vertex : SV_POSITION;
				float2 uv_Main : TEXCOORD0;
				float2 uv_Bump : TEXCOORD1;
				float4 uvgrab : TEXCOORD2;
				float3 refl : TEXCOORD3;
			};

				sampler2D _MainTex;
				sampler2D _BumpMap;
				float4 _MainTex_ST;
				float4 _BumpMap_ST;
				samplerCUBE _Cube;
				half4 _Color;
				half4 _ReflectColor;
				half _Cutoff;
				float _Alpha;

			v2f vert(appdata_t v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv_Main = TRANSFORM_TEX(v.texcoord, _MainTex);
				o.uv_Bump = TRANSFORM_TEX(v.texcoord, _BumpMap);
				float3 viewDir = mul(unity_ObjectToWorld, v.vertex).xyz - _WorldSpaceCameraPos;
				float3 normalDir = normalize(mul(float4(v.normal, 0.0), unity_WorldToObject).xyz);
				o.refl = reflect(viewDir, normalDir);
				return o;
			}

			half4 frag(v2f i) : SV_Target
			{
				half3 bump = UnpackNormal(tex2D(_BumpMap, i.uv_Bump));
				half4 col = tex2D(_MainTex, i.uv_Main );
				half reflcol = dot(texCUBE(_Cube, i.refl*(bump*2-1)), 0.33);
				reflcol *= col.a;
				col.rgb = col.rgb * _Color + reflcol * _ReflectColor.rgb * col * 4;
				col.a = col.a * saturate(step(1 - col.a, _Cutoff))*_Alpha;
				return col;
			}
			ENDCG
			
		}
	}

}

 

col.a = col.a * saturate(step(1 - col.a, _Cutoff))*_Alpha;

这里没有用到溶解,但是用这种方法模拟了溶解的效果

 

亲,如果您觉得本文不错,愿意给我一些动力的话,请用手机扫描二维码即可向我打赏

                                         打赏

 

  • 0
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是一个简单的Unity3D着色器,可以制作冰冻效果。它使用了一个简单的反射纹理和一个噪声纹理来创建冰的外观。 ``` Shader "Custom/IceShader" { Properties { _MainTex ("Texture", 2D) = "white" {} _ReflectTex ("Reflect Texture", 2D) = "white" {} _NoiseTex ("Noise Texture", 2D) = "white" {} _BumpScale ("Bump Scale", Range(0.01, 0.1)) = 0.05 _Reflectivity ("Reflectivity", Range(0.0, 1.0)) = 0.5 _NoiseScale ("Noise Scale", Range(0.1, 10.0)) = 1.0 _IceColor ("Ice Color", Color) = (1,1,1,1) } SubShader { Tags { "Queue"="Transparent" "RenderType"="Opaque" } LOD 100 CGPROGRAM #pragma surface surf Standard sampler2D _MainTex; sampler2D _ReflectTex; sampler2D _NoiseTex; float _BumpScale; float _Reflectivity; float _NoiseScale; fixed4 _IceColor; struct Input { float2 uv_MainTex; float2 uv_ReflectTex; float2 uv_NoiseTex; float3 worldPos; float3 worldNormal; }; void surf (Input IN, inout SurfaceOutputStandard o) { // Get the base color from the main texture fixed4 baseColor = tex2D(_MainTex, IN.uv_MainTex); // Get the reflection from the reflect texture fixed4 reflectColor = tex2D(_ReflectTex, IN.uv_ReflectTex); // Combine the base color and reflection fixed4 finalColor = lerp(baseColor, reflectColor, _Reflectivity); // Apply the ice color finalColor *= _IceColor; // Get the bump from the noise texture float4 noise = tex2D(_NoiseTex, IN.uv_NoiseTex); // Convert the noise to a normal vector float3 normal = UnpackNormal(noise.rgb); // Apply the bump to the surface normal IN.worldNormal += normal * _BumpScale; // Set output parameters o.Albedo = finalColor.rgb; o.Metallic = 0.0; o.Smoothness = 1.0; o.Normal = normalize(IN.worldNormal); o.Emission = finalColor.rgb; o.Occlusion = 1.0; o.Alpha = finalColor.a; } ENDCG } FallBack "Diffuse" } ``` 要使用这个着色器,您需要将三个纹理分别指定给_MainTex,_ReflectTex和_NoiseTex属性。您还可以调整_BumpScale,_Reflectivity和_NoiseScale参数来改变效果。最后,您可以使用_IceColor来指定冰的颜色。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值