1、边缘光
混合为什么要关闭深度写入?
透明队列为后前渲染,不关闭深度写入则会覆盖之前的像素,导致混合不了。
菲尼尔效果(简化版公式):fresnel = base + scale*((1-v*n)^power)
两色混合做个demo看看!!!
Clip的demo结合噪声图再学习,再写shader。
half4 frag (v2f i) : SV_Target
{
i.norW=normalize(i.norW);
float3 v=normalize(i.viewH);
half NdotV=1-dot(v,i.norW);
half alpha=pow(NdotV,_franelIntensiy);
return half4(_MainColor.rgb*_Intensiy,_franelIntensiy*alpha);
}
注意:二次Pass可以看不到里面的细节。
无深度写入 有深度写入
Pass
{
Cull Off
ZWrite On
ColorMask 0
CGPROGRAM
float4 _Color;
#pragma vertex vert
#pragma fragment frag
float4 vert(float4 vertexPos : POSITION) : SV_POSITION
{
return UnityObjectToClipPos(vertexPos);
}
float4 frag(void) : COLOR
{
return _Color;
}
ENDCG
}
2、流光
smoothstep(x1,x2,x3)函数:
y的值为0~1,根据x3返回对应y值。
边缘光加流光:
half4 frag (v2f i):SV_TARGET
{
float3 v=normalize(_WorldSpaceCameraPos-i.posW);
float3 n=normalize(i.normalW);
half NdotV=saturate(dot(n,v));
half fresnel=1-NdotV;
fresnel=smoothstep(_RimMin,_RimMax,fresnel);
half4 RimColor=lerp(_InnerColor,_RimColor*_RimIntensity,fresnel);
half2 uvFlow=(i.posW.xy-i.privot.xy)*_FlowTilling.xy;//仅留y方向
uvFlow=uvFlow+_Time.y*_FlowSpeed;//随时间而变
float4 flowColor=tex2D(_FlowTex,uvFlow)*_FlowIntensity*_FlowColor;//给纹理附上颜色
half3 final=flowColor.xyz+RimColor.xyz;
return half4(final,fresnel);
}
3、Matcap
matcap :采样一张像是表现某种特性(看起来真实)的贴图。
ramp 采用菲涅尔过渡
加一除以二,控制在0到1的范围,得以采样整张贴图。
fixed4 frag (v2f i) : SV_Target
{
half3 normal_world = normalize(i.normal_world);
//base matcap
half3 normal_viewspace = mul(UNITY_MATRIX_V, float4(normal_world, 0.0)).xyz;
half2 uv_matcap = (normal_viewspace.xy + float2(1.0, 1.0)) * 0.5;//转换
half4 matcap_color = tex2D(_Matcap, uv_matcap) * _MatcapIntensity;
half4 diffuse_color = tex2D(_MainTex, i.uv);
//Ramp薄膜干涉
half3 view_dir = normalize(_WorldSpaceCameraPos.xyz - i.pos_world);
half NdotV = saturate(dot(normal_world, view_dir));
half fresnel = 1.0 - NdotV;
half2 uv_ramp = half2(fresnel, 0.5);//rampmap取0.5还是其他都是一样的
half4 ramp_color = tex2D(_RampTex, uv_ramp);
//add matcap
half4 matcap_add_color = tex2D(_MatcapAdd, uv_matcap) * _MatcapAddIntensity;
half4 combined_color = diffuse_color * matcap_color * ramp_color + matcap_add_color;
return combined_color;
}