当前位置:   article > 正文

【Unity Shader】带描边的半透明材质处理(头发为例)_为何人物头发透贴之后再unity中远处看的时候头发带有白边

为何人物头发透贴之后再unity中远处看的时候头发带有白边

最近做头发shader的时候做了这么一个简单测试,用的模型是以前制作的一个角色头部,在这里用来记录一下作为学习的总结。

基本思路就是利用3个Pass处理带描边的半透明材质

看下最终的测试截图(头发的材质不在本次讨论范围,有机会单独做一个总结):



关于Blend部分也测试下截图保留:


1.第一个Pass开启深度写入,处理AlphaTest,但不输出颜色
  1. //第一个Pass,开启深度写入,不输出颜色,处理AlphaTest部分
  2. Pass{
  3. // 仅仅是把模型的深度信息写入深度缓冲中从而剔除模型中被自身遮挡的片元
  4. ZWrite On
  5. // 用于设置颜色通道的写掩码(Wirte Mask)ColorMask RGB|A|0|(R/G/B/A组合)
  6. // 当为0时意味着该Pass不写入任何颜色通道,也就不会输出任何颜色
  7. //也可以不用,这样就能刻意控制AlphaTest导致的发丝边缘的颜色
  8. ColorMask 0
  9. CGPROGRAM
  10. #pragma vertex vert  
  11. #pragma fragment frag  
  12. #include "Lighting.cginc"  
  13. sampler2D _MainTex;
  14. float4 _MainTex_ST;
  15. fixed _AlphaTest;
  16. struct a2v {
  17. float4 vertex : POSITION;
  18. float4 texcoord : TEXCOORD0;
  19. };
  20. struct v2f {
  21. float4 pos : SV_POSITION;
  22. float2 uv : TEXCOORD2;
  23. };
  24. v2f vert(a2v v) {
  25. v2f o;
  26. o.pos = UnityObjectToClipPos(v.vertex);
  27. o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
  28. return o;
  29. }
  30. fixed4 frag(v2f i) : SV_Target{
  31. fixed4 texColor = tex2D(_MainTex, i.uv);
  32. //AlphaTest
  33. clip(texColor.a - _AlphaTest);//clip函数,但参数为负数则舍弃该片元输出
  34. return fixed4(0,0,0,1);
  35. }
  36. ENDCG
  37. }
2.第二个Pass关闭深度写入,处理半透明物体以及主体部分
  1. //第二个Pass,关闭深度写入,处理AlphaBlend半透明,处理光照等部分
  2. Pass{
  3. // 向前渲染路径的方式
  4. Tags{ "LightMode" = "ForwardBase" }
  5. Cull Off //关闭剔除,让头发双面显示
  6. ZWrite Off //关闭深度写入  
  7. //透明度混合需要关闭深度写入    
  8. //Orgb = SrcAlpha * Srgb + OneMinusSrcAlpha * Drgb
  9. //Oa = SrcAlpha * Sa + OneMinusSrcAlpha * Da
  10. //将本Shader计算出的颜色值(源颜色值) * 源Alpha值 + 目标颜色值(可以理解为背景色) * (1-源Alpha值),从而让源物体展示出了(1-a
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/127002
推荐阅读
相关标签
  

闽ICP备14008679号