您的位置:首页 > 移动开发 > Unity3D

Unity3D Shader(19)——一个简单的色散

2017-09-06 00:25 369 查看
这里放一个简单的色散的效果。

Shader "Custom/fresel" {
Properties {
_FresnelBias("Bias",range(0,1))=0
_FresnelScale("Scale",range(0,1))=0
_FresnelPow("Pow",range(0,5))=1
_CubeTex ("CubeTex", cube) = "white" {}
}
SubShader {
Tags {"RenderType"="Opaque" "Queue"="transparent"}

LOD 100
grabpass{}
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"

struct v2f{
float3 refr_r:TEXCOORD0;
float3 refr_g:TEXCOORD1;
float3 refr_b:TEXCOORD2;
float3 L:TEXCOORD3;
float3 N:TEXCOORD4;
float3 V:TEXCOORD5;
float4 pos:SV_POSITION;
};

samplerCUBE _CubeTex;
float _FresnelBias,_FresnelScale,_FresnelPow;
v2f vert(appdata_base v)
{
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
float3 i=WorldSpaceViewDir(v.vertex);
i=-normalize(i);
o.V=-i;
float3 n=mul(float4(v.normal,0),unity_WorldToObject).xyz;
n=normalize(n);
o.N=n;
o.refr_r=refract(i,n,0.96);
o.refr_g=refract(i,n,0.98);
o.refr_b=refract(i,n,1);
o.L=normalize(WorldSpaceLightDir(v.vertex));
return o;
}
fixed4 frag(v2f i):SV_Target
{
fixed4 col;
col.r=texCUBE(_CubeTex,i.refr_r).r;
col.g=texCUBE(_CubeTex,i.refr_g).g;
col.b=texCUBE(_CubeTex,i.refr_b).b;

float diff=max(0,dot(i.N,i.L));
float3 H=normalize(i.L+i.V);
float spec=pow(max(0,dot(i.N,H)),64);

col.a=1;
col=col*_LightColor0*diff+_LightColor0*spec;
float4 fresnel=_FresnelBias+_FresnelScale*pow(1+dot(i.N,-normalize(i.V)),_FresnelPow);
col=lerp(col,_LightColor0,fresnel);
return col;
}

ENDCG
}
}
//FallBack "Diffuse"
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity3d