冰shader_写一个水材质与冰材质的shader

这篇博客展示了如何创建一个自定义Shader,分别实现水的动态流动效果和冰的静态折射效果。作者通过调整纹理坐标和使用自定义的渲染方法来模拟水的波动与冰的透明质感。博客中提供了Shader代码片段,但完整代码因公司规定无法提供。
摘要由CSDN通过智能技术生成

看图文吧,不能复制只能发图,

其实我也想写出来,让大家直接复制,就是没有办法只能截图了。

效果如下:

一个是水里的效果

一个是冰的效果

有相关开关

透明度图,其实是透明的物体折射,不透明的物体没有折射效果。就这个作用

算法主要从热浪材质再进行自我修改,使用自创的渲染法。不过这是手机用的效果一般,算法简单清明。

思维如下:

水就是一个costime与sintime的法图对向流动

冰是静态的冰效果,是法线求折射图。其实是一个假折,其实可以优化,做出深度感。日后更新

///

分切线(下面是升级内容)

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

多做两种效果,一种是冰下的混动,一种是水里的混动,冰内就是多加一个法线.

第二种水方法,就是混动,上面有点像热浪

这里再多加了冰内的混动

下是记忆的代码,因为公司源代码不能外流,我也没有办法,就随手再写了一个

Shader "NOrrr/my_distortion" {

Properties {

_NoiseTex ("Normal Texture", 2D) = "white"

{}

_MainTex ("(Alpha)A", 2D) = "white" {}

_Speed ("speed", range (0,3)) = 1

_WaterForce ("Water Force", range (0,0.1)) = 0.1

[KeywordEnum(Off,On)]_isWater("is water",float)=1

_Power("noWater Power",Range(0.01,2))=1

[KeywordEnum(Off,On)]_isWaterB("waterB",float)=1

[KeywordEnum(Off,On)]_isIceMov("Ice move",float)=1

_CtrlBWater("waterb ctrl",Vector)=(.01,0.01,5,5)

}

Category {

Tags { "Queue"="Transparent+1" "RenderType"="Transparent" }

Blend SrcAlpha OneMinusSrcAlpha

AlphaTest Greater .01

Cull Back Lighting Off ZWrite Off

SubShader {

GrabPass {

Name "BASE"

Tags { "LightMode" = "Always" }

}

Pass {

Name "BASE"

Tags { "LightMode" = "Always" }

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#pragma fragmentoption ARB_precision_hint_fastest

#pragma multi_compile _ISWATER_OFF _ISWATER_ON

#pragma multi_compile _ISWATERB_OFF _ISWATERB_ON

#pragma multi_compile _ISICEMOV_OFF _ISICEMOV_ON

#include "UnityCG.cginc"

struct appdata_t {

float4 vertex : POSITION;

fixed4

color:COLOR;

float2 texcoord:

TEXCOORD0;

};

struct v2f {

float4 vertex : POSITION;

float4 uvgrab :

TEXCOORD0;

float2 uvmain :

TEXCOORD1;

};

float _WaterForce;

float _Speed;

float _Power;

float4 _NoiseTex_ST;

sampler2D _NoiseTex;

sampler2D _MainTex;

float4 _MainTex_ST;

sampler2D _GrabTexture;

float4 _CtrlBWater;

v2f vert (appdata_t v)

{

v2f o;

o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);

#if UNITY_UV_STARTS_AT_TOP // Direct3D类似平台scale为-1;OpenGL类似平台为1。

float scale = -1.0;

#else

float scale = 1.0;

#endif

o.uvgrab.xy = (float2(o.vertex.x,

o.vertex.y * scale) + o.vertex.w) * 0.5;

o.uvgrab.zw = o.vertex.zw;

o.uvmain = TRANSFORM_TEX(v.texcoord, _MainTex);

return o;

}

half4 frag( v2f i ) :

COLOR

{

#if _ISWATER_ON

#if _ISWATERB_OFF

float2 tc2 =i.uvmain;

tc2.x+=_SinTime*_Speed;

tc2.y-=_CosTime*_Speed;

float4 wiggle=tex2D(_NoiseTex,tc2);

i.uvgrab.x-=wiggle.r*_WaterForce;

i.uvgrab.y+=wiggle.g*_WaterForce*1.5;

#endif

#if _ISWATERB_ON

float2 tc2=i.uvmain;

float time =_Time.y*_Speed;

float

xAngle=time+tc2.y*_CtrlBWater.y;

float

yAngle=time+tc2.x*_CtrlBWater.x;

#if _ISICEMOV_ON

float3 wiggle=UnpackNormal(tex2D(_NoiseTex,tc2);

float2 distortOffset=float2(sin(xAngle),sin(yAngle))*float2(_CtrlBWater.z,_CtrlBWater.w)+wiggle.rg;

#endif

#if _ISICEMOV_OFF

float2 distortOffset=float2(sin(xAngle),sin(yAngle))*float2(_CtrlBWater.z,_CtrlBWater.w);

#endif

//i.uvgragb.xy+=distortOffset;

#endif

#endif

#if _ISWATER_OFF

float3 wiggle=UnpackNormal(tex2D(_NoiseTex,i.uvmain))*_Power;

i.uvgrab.x+=wiggle.r;

i.uvgrab.y+=wiggle.g;

#endif

half4 myCol = tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(i.uvgrab));

half4 tint = tex2D(_MainTex, i.uvmain);

return myCol * tint;

}

ENDCG

}//end pass

}//end subshader

SubShader {

Blend DstColor Zero

Pass {

Name "BASE"

SetTexture [_MainTex] { combine texture }

}

}

}

}

下面的sur shader的制作方法,相对于之前有很大的不同

Shader "MY_surDist" {

Properties {

_Color ("Main Color", Color) = (1,1,1,1)

_SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)

_Shininess ("Shininess", Range (0.03, 1)) = 0.3

_MainTex ("Base (RGB)", 2D) = "white" {}

_BumpMap ("Normalmap", 2D) = "bump" {}

_DistAmt ("Distortion", range (0,128)) = 10

}

SubShader {

GrabPass { }

Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Opaque" }

LOD 200

CGPROGRAM

#pragma exclude_renderers gles

#pragma surface surf BlinnPhong vertex:vert

#include "UnityCG.cginc"

float4 _Color;

float _Shininess;

sampler2D _MainTex;

sampler2D _BumpMap;

sampler2D _GrabTexture;

float _DistAmt;

float4 _GrabTexture_TexelSize;

struct Input {

float2 uv_MainTex;

float2 uv_BumpMap;

float4 proj : TEXCOORD;

};

void vert (inout appdata_full v,out Input o) {

UNITY_INITIALIZE_OUTPUT(Input,o);

float4 oPos = UnityObjectToClipPos(v.vertex);

#if UNITY_UV_STARTS_AT_TOP

float scale = -1.0;

#else

float scale = 1.0;

#endif

o.proj.xy = (float2(oPos.x, oPos.y*scale) + oPos.w) * 0.5;

o.proj.zw = oPos.zw;

}

void surf (Input IN, inout SurfaceOutput o) {

half3 nor = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));

float2 offset = nor * _DistAmt * _GrabTexture_TexelSize.xy;

IN.proj.xy = offset * IN.proj.z + IN.proj.xy;

half4 col = tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(IN.proj));

half4 tex = tex2D(_MainTex, IN.uv_MainTex);

o.Albedo = tex.rgb * _Color.rgb * col.rgb;

o.Normal = nor.rgb;

o.Specular = _Shininess;

o.Gloss = tex.a;

o.Alpha = 1;

}

ENDCG

}

FallBack "Diffuse"

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值