Matcap与菲涅尔

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值