当前位置:   article > 正文

Unity用Shader实现边缘光效果_unity3d shader 边缘光

unity3d shader 边缘光

《自学记录》

1、先创建一个Cube,再创建两个材质球Cube、Unilt

2、再创建一个shader代码UniltShader【Project右键Create->Shader->NewSurfaceShader】把里面原来的代码删除,写入下面的代码

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

3、把shader UniltShader拖给材质球Unilt

4、把Cube的Mesh Renderer中Materials的Size改为2,然后把材质球Cube、Unilt分别拖到Element0和Element1中,如下图

自己修改想要的边缘颜色(修改Unilt)

最终效果

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

闽ICP备14008679号