当前位置:   article > 正文

UnityShader基础案例(三)——外发光(泛光)和内发光_unity 模型边缘发光 csdn

unity 模型边缘发光 csdn

基于菲涅尔反射来判断边缘所在。

  1. Shader "Custom/Test0"
  2. {
  3. Properties
  4. {
  5. _MainColor("主颜色",Color)=(0,0,0,1)
  6. _InnerGlowColor("内发光颜色",Color)=(1,1,1,1)
  7. _InnerGlowPow("内发光等级",Range(0,5))=2
  8. _InnerGlowStrength("内发光强度",Range(0,4))=1
  9. _HaloColor("外光晕颜色",Color)=(1,1,1,1)
  10. _HaloArea("外光晕范围",Range(0,2))=1
  11. _HaloPow("外光晕等级",Range(0,3))=1
  12. _HaloStrength("外光晕强度",Range(0,4))=1
  13. }
  14. SubShader
  15. {
  16. //第一个Pass实现内发光,或者说边缘发光
  17. Pass
  18. {
  19. CGPROGRAM
  20. #pragma vertex vert
  21. #pragma fragment frag
  22. #include "UnityCG.cginc"
  23. float4 _MainColor;
  24. fixed4 _InnerGlowColor;
  25. fixed _InnerGlowPow;
  26. fixed _InnerGlowStrength;
  27. struct a2v
  28. {
  29. float4 vertex:POSITION;
  30. float3 normal:NORMAL;
  31. };
  32. struct v2f
  33. {
  34. float4 pos:SV_POSITION;
  35. float3 normal:TEXCOORD0;
  36. float3 worldPos:TEXCOORD1;
  37. };
  38. v2f vert(a2v v)
  39. {
  40. v2f o;
  41. o.pos = UnityObjectToClipPos(v.vertex);
  42. o.normal = UnityObjectToWorldNormal(v.normal);
  43. o.worldPos = mul(unity_ObjectToWorld, v.vertex);
  44. return o;
  45. }
  46. fixed4 frag(v2f i):SV_Target
  47. {
  48. i.normal = normalize(i.normal);
  49. float3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos)); normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);
  50. //越边缘,值越大
  51. float fresnel = pow(1 - saturate(dot(i.normal, viewDir)), _InnerGlowPow) * _InnerGlowStrength;
  52. fixed3 color = lerp(_MainColor, _InnerGlowColor, fresnel);
  53. return fixed4(color, 1);
  54. }
  55. ENDCG
  56. }
  57. Pass
  58. {
  59. //剔除正面,防止外边缘遮住原模型,并不是所有的都需要剔除正面,比如袖子什么的
  60. //那个需要开启深度模板什么的,暂时还没学到
  61. Cull Front
  62. //混合用于控制外边缘强度
  63. Blend SrcAlpha OneMinusSrcAlpha
  64. //ZWrite off 这个用于外边缘叠加和其他物体叠加时可能会产生的透明边界的情形
  65. CGPROGRAM
  66. #pragma vertex vert
  67. #pragma fragment frag
  68. #include "UnityCG.cginc"
  69. fixed4 _HaloColor;
  70. fixed _HaloPow;
  71. fixed _HaloArea;
  72. fixed _HaloStrength;
  73. struct a2v
  74. {
  75. float4 vertex:POSITION;
  76. float3 normal:NORMAL;
  77. };
  78. struct v2f
  79. {
  80. float4 pos:SV_POSITION;
  81. float3 normal:TEXCOORD0;
  82. float4 worldPos:TEXCOORD1;
  83. };
  84. v2f vert(a2v v)
  85. {
  86. v2f o;
  87. o.normal = UnityObjectToWorldNormal(v.normal);
  88. v.vertex.xyz += v.normal * _HaloArea;
  89. o.pos = UnityObjectToClipPos(v.vertex);
  90. o.worldPos = mul(unity_ObjectToWorld, v.vertex);
  91. return o;
  92. }
  93. fixed4 frag(v2f i):SV_Target
  94. {
  95. i.normal = normalize(i.normal);
  96. //和Pass一不一样,原因是我们要把背面当正面渲染,所以视角方向要相反
  97. float3 viewDir = normalize(i.worldPos.xyz - _WorldSpaceCameraPos.xyz);
  98. //边缘仍然使用菲涅尔判断,只是和检测方式内边缘不同
  99. float fresnel = pow(saturate(dot(i.normal, viewDir)), _HaloPow) * _HaloStrength;
  100. return fixed4(_HaloColor.rgb, fresnel);
  101. }
  102. ENDCG
  103. }
  104. }
  105. }

                    这种写法是建立在顶点数多的情况,而且对于模型的对称也有一定的要求。

        球形效果就还行,但立方体的效果就很差 。       

        这种基于菲涅尔的泛光对模型的要求很高,可以用基于高斯模糊的泛光,效果巨好,可以参考物体描边一章,效果图在这篇文章的末尾,都是基于高斯模糊。        

(65条消息) UnityShader基础案例(五)——物体描边_implosion98的博客-CSDN博客_unity 描边

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

闽ICP备14008679号