当前位置:   article > 正文

Unity 两个Shader实现物体描边高亮效果_unity模型边缘高光

unity模型边缘高光

最终效果(自己忘记截图了,来源于别人的blog):

准备两个shader:一个shader是物体自身的shader(origin.shader),一个shader实现描边高亮(highlight.shader)。

highlight.shader代码如下:(代码来源:https://www.cnblogs.com/alps/p/7606028.html)

  1. Shader "Custom/highlight "{
  2.     //属性  
  3.     Properties{
  4.         _Diffuse("Diffuse", Color) = (1,1,1,1)
  5.         _OutlineCol("OutlineCol", Color) = (1,0,0,1)
  6.         _OutlineFactor("OutlineFactor", Range(0,1)) = 0.1
  7.         _MainTex("Base 2D", 2D) = "white"{}
  8.     }
  9.  
  10.         //子着色器    
  11.         SubShader
  12.     {
  13.  
  14.         //描边使用两个Pass,第一个pass沿法线挤出一点,只输出描边的颜色  
  15.         Pass
  16.         {
  17.         //剔除正面,只渲染背面,对于大多数模型适用,不过如果需要背面的,就有问题了  
  18.         Cull Front
  19.  
  20.         CGPROGRAM
  21.         #include "UnityCG.cginc"  
  22.         fixed4 _OutlineCol;
  23.         float _OutlineFactor;
  24.  
  25.         struct v2f
  26.         {
  27.             float4 pos : SV_POSITION;
  28.         };
  29.  
  30.         v2f vert(appdata_full v)
  31.         {
  32.             v2f o;
  33.             //在vertex阶段,每个顶点按照法线的方向偏移一部分,不过这种会造成近大远小的透视问题  
  34.             //v.vertex.xyz += v.normal * _OutlineFactor;  
  35.             o.pos = UnityObjectToClipPos(v.vertex);
  36.             //将法线方向转换到视空间  
  37.             float3 vnormal = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);
  38.             //将视空间法线xy坐标转化到投影空间,只有xy需要,z深度不需要了  
  39.             float2 offset = TransformViewToProjection(vnormal.xy);
  40.             //在最终投影阶段输出进行偏移操作  
  41.             o.pos.xy += offset * _OutlineFactor;
  42.             return o;
  43.         }
  44.  
  45.         fixed4 frag(v2f i) : SV_Target
  46.         {
  47.             //这个Pass直接输出描边颜色  
  48.             return _OutlineCol;
  49.         }
  50.  
  51.             //使用vert函数和frag函数  
  52.             #pragma vertex vert  
  53.             #pragma fragment frag  
  54.             ENDCG
  55.         }
  56.     }
  57.         //前面的Shader失效的话,使用默认的Diffuse  
  58.             FallBack "Diffuse"
  59. }


准备两个材质(material):

一号材质origin.mat用origin.shader;

二号材质highlight.mat用highlight.shader,可以通过改变OutlineFactor使描边更真实。

 

点击物体的Materials,把1改成2,随便点击一下面板空白的地方,确认后,把highlight拖进element 1:


————————————————
原文链接:https://blog.csdn.net/iteapoy/article/details/90138864

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/110157
推荐阅读
相关标签
  

闽ICP备14008679号