当前位置:   article > 正文

一日一Shader·基础卡通【SS_23】_objspacelightdir

objspacelightdir

卡通效果的特点是颜色呈块状,即便有过渡,也是一块块色块。要实现主要用到floor方法,将本来是过渡的颜色铺平。

  1. Shader "MyShader/SS_23"
  2. {
  3. //属性
  4. Properties{
  5. _MainTex("Texture", 2D) = ""{}
  6. _Normal("Normal", 2D) = ""{}
  7. _Emission("Emission",Range(0,1))=0.5
  8. _Wrap("Wrap",Range(0,1))=0.5
  9. _LayerCount("LayerCount",float)=3
  10. }
  11. //子着色器
  12. SubShader
  13. {
  14. Tags{ "LightMode" = "UniversalForward" }
  15. CGINCLUDE
  16. #include "Lighting.cginc"
  17. sampler2D _MainTex;
  18. sampler2D _Normal;
  19. float _Emission;
  20. float _Wrap;
  21. float _LayerCount;
  22. struct appdata {
  23. float4 vertex : POSITION;
  24. float4 tangent : TANGENT;//切线方向
  25. float3 normal : NORMAL;//法线方向
  26. float4 uv : TEXCOORD0;
  27. };
  28. struct v2f
  29. {
  30. float4 pos : SV_POSITION;
  31. float2 uv : TEXCOORD0;
  32. //tangent空间的光线方向
  33. float3 lightDir : TEXCOORD1;
  34. };
  35. v2f vert(appdata v)
  36. {
  37. v2f o;
  38. o.pos = UnityObjectToClipPos(v.vertex);
  39. //这个宏为我们定义好了模型空间到切线空间的转换矩阵rotation,注意后面注释的是具体计算;
  40. TANGENT_SPACE_ROTATION;
  41. //float3 binormal = cross( normalize(v.normal), normalize(v.tangent.xyz) ) * v.tangent.w; //副切线方向,*w是为了确定方向正确
  42. //float3x3 rotation = float3x3( v.tangent.xyz, binormal, v.normal );//TangentBinormalNormal确定一个面的rotation状态
  43. //ObjectSpaceLightDir可以把光线方向转化到模型空间,然后通过rotation再转化到切线空间
  44. o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex));
  45. o.uv=v.uv;
  46. return o;
  47. }
  48. fixed4 frag(v2f i) : SV_Target
  49. {
  50. //环境光
  51. fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
  52. //获取法线
  53. float3 normal = UnpackNormal(tex2D(_Normal, i.uv));
  54. //光照方向
  55. float3 lightDir = normalize(i.lightDir);
  56. // fixed3 lambert = max(0,dot(normal, lightDir));//Lambert光照模型
  57. fixed3 lambert =_Wrap*dot(normal, lightDir)+1-_Wrap; //半兰博通用化公式
  58. //加入光照,最终为颜色强度
  59. fixed3 diffuse = floor(lambert*_LayerCount) * _LightColor0.xyz + ambient;
  60. fixed4 color = tex2D(_MainTex, i.uv);
  61. return fixed4(diffuse* color.rgb+_Emission* color.rgb, 1.0);
  62. }
  63. ENDCG
  64. Pass
  65. {
  66. CGPROGRAM
  67. #pragma vertex vert
  68. #pragma fragment frag
  69. ENDCG
  70. }
  71. }
  72. }

返回目录:https://blog.csdn.net/yzy1987523/article/details/106676451

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

闽ICP备14008679号