思路:
1.用uv画出边缘线
2.贴图叠加动态扫描
UV边缘线原理:
(仅适用于面数少的 比较规则的图形)
代码段:
float UVMake(float3 uv )
{
uv=abs(uv*2-1);
uv= pow(uv,_EdgeWidth);
float outuv = lerp(uv.x,uv.y,0.5);
//第二次插值是因为我传进来的是世界坐标 我需要一个三维的描边
//outuv=lerp(outuv,uv.z,0.5);
outuv-=_UVDepth;
return outuv;
}
顶点着色器中传出世界坐标
像素着色器如下
half4 frag (v2f i) : SV_Target
{
float color = UVMake(frac(input.positionWS.xyz));
return color;
}
贴图叠加动态扫描
使用了贴图的r和a通道 分别放花纹和扫描线
花纹是SD做的(ps也可以)
A通道尽量让浅色区域小点
贴图采样像素着色器
half4 frag(v2f i):SV_Target
{
float3 triW = normalize(abs(input.normalWS));
//流光图采样(动态
half4 Secondcolorx = tex2D(_MainTex, float2(-input.positionWS.y , input.positionWS.x )*_Tilling.xy+_Time.x*_TimeSpeed.xy);
half4 Secondcolorz = tex2D(_MainTex, float2(-input.positionWS.y , input.positionWS.z)*_Tilling.xy+_Time.x*_TimeSpeed.xy);
//没有用到Y 因为我不想在横截面显示 如果需要都显示就加上Y
half4 Secondcol =Secondcolorx* triW.x+ Secondcolorz* triW.z;
//纹理采样
half4 Secondcolorx2 = tex2D(_MainTex, float2(input.positionWS.y, input.positionWS.x ));
half4 Secondcolorz2 = tex2D(_MainTex, float2(input.positionWS.y, input.positionWS.z ));
half4 Secondcol2 =Secondcolorx2* triW.x+ Secondcolorz2* triW.z;//+ Secondcolorz * triW.z);
//边框
float color = UVMake(frac(input.positionWS.xyz));
half4 finalcol = (Secondcol2.r)*pow(Secondcol.a,1)+color*0.5;
return finalcol;
}