当前位置:   article > 正文

Unity3d shaderlab 实现多个贴图混合叠加与裁剪_unity怎么绘制多个tilling采样多个贴图

unity怎么绘制多个tilling采样多个贴图

今天我们讨论一下,如何在unity3d的一个plane中显示多张贴图的一部分,组合贴图。

首先新建一个plane



然后在project面板新建一个材质





将材质赋给这个plane


然后编写shader whiteboard.shader

将这个shader赋给材质

  1. Shader "Custom/WhiteBoard" {
  2. Properties
  3. {
  4. //下面三个是要叠加的贴图
  5. _MainTex ("Base (RGB), Alpha (A)", 2D) = "white" {}
  6. _MiddleTex ("Middle (RGB),Alpha (A)", 2D) = "white" {}
  7. _TopTex ("Top (RGB),Alpha (A)", 2D) = "white" {}
  8. _WhiteBoardTex ("WhiteBoard (RGB),Alpha (A)", 2D) = "white" {}//需要一个白色的贴图做底色
  9. _StencilComp ("Stencil Comparison", Float) = 8
  10. _Stencil ("Stencil ID", Float) = 0
  11. _StencilOp ("Stencil Operation", Float) = 0
  12. _StencilWriteMask ("Stencil Write Mask", Float) = 255
  13. _StencilReadMask ("Stencil Read Mask", Float) = 255
  14. _ColorMask ("Color Mask", Float) = 15
  15. // 以 1 - _Height 长度为高度
  16. _Height ("Radius", Range(0,0.5)) = 0.5
  17. _TopRate ("TopRate", Range(0,1)) = 0.33 //显示裁剪的比例
  18. _MiddleRate ("MiddleRate", Range(0,1)) = 0.33
  19. _ButtomRate ("ButtomRate", Range(0,1)) = 0.33
  20. }
  21. SubShader
  22. {
  23. LOD 100
  24. Tags
  25. {
  26. "Queue" = "Transparent"
  27. "IgnoreProjector" = "True"
  28. "RenderType" = "Transparent"
  29. "PreviewType"="Plane"
  30. }
  31. Stencil
  32. {
  33. Ref [_Stencil]
  34. Comp [_StencilComp]
  35. Pass [_StencilOp]
  36. ReadMask [_StencilReadMask]
  37. WriteMask [_StencilWriteMask]
  38. }
  39. Cull Off
  40. Lighting Off
  41. ZWrite Off
  42. ZTest [unity_GUIZTestMode]
  43. Offset -1, -1
  44. Fog { Mode Off }
  45. Blend SrcAlpha OneMinusSrcAlpha
  46. ColorMask [_ColorMask]
  47. Pass
  48. {
  49. CGPROGRAM
  50. #pragma target 3.0
  51. #pragma vertex vert
  52. #pragma fragment frag
  53. #include "UnityCG.cginc"
  54. float _Height;
  55. float _TopRate;
  56. float _MiddleRate;
  57. float _ButtomRate;
  58. struct appdata_t
  59. {
  60. float4 vertex : POSITION;
  61. float2 texcoord : TEXCOORD0;
  62. fixed4 color : COLOR;
  63. };
  64. struct v2f
  65. {
  66. float4 vertex : SV_POSITION;
  67. half2 texcoord : TEXCOORD0;
  68. fixed4 color : COLOR;
  69. };
  70. sampler2D _MainTex;
  71. sampler2D _MiddleTex;
  72. sampler2D _TopTex;
  73. sampler2D _WhiteBoardTex;
  74. float4 _MainTex_ST;
  75. v2f vert (appdata_t v)
  76. {
  77. v2f o;
  78. o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
  79. o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
  80. o.color = v.color;
  81. #ifdef UNITY_HALF_TEXEL_OFFSET
  82. o.vertex.xy += (_ScreenParams.zw-1.0)*float2(-1,1);
  83. #endif
  84. return o;
  85. }
  86. fixed4 frag (v2f i) : COLOR
  87. {
  88. fixed4 col2 = tex2D(_MiddleTex, i.texcoord) ;//获得贴图的rgba,颜色像素信息
  89. fixed4 base_col = tex2D(_MainTex, i.texcoord) ;
  90. fixed4 top_pic = tex2D(_TopTex, i.texcoord) ;
  91. fixed4 white_canva = tex2D(_WhiteBoardTex, i.texcoord) ;
  92. float2 uv = i.texcoord.xy; //输入的面的uv坐标
  93. float4 c = i.color; //输入的面的颜色信息
  94. float4 c1 = i.color;
  95. float4 c3 = i.color;
  96. float4 c_alpha_mask = i.color;
  97. fixed4 col4 = col2;
  98. if( uv.y < _TopRate && uv.y > 0.0)
  99. {
  100. c.rgba = col2.rgba;//根据不同的uv坐标显示不同贴图的颜色信息
  101. }
  102. if( uv.y > _TopRate + _MiddleRate && uv.y <1.0)
  103. {
  104. c1.rgba = base_col.rgba;
  105. }
  106. if(uv.y>_TopRate && uv.y<_TopRate + _MiddleRate)
  107. {
  108. c3.rgba = top_pic.rgba;
  109. }
  110. fixed4 col_a = white_canva * c * c1 *c3;//将颜色信息与白色底图叠加
  111. return col_a; //最后输出叠加后的颜色信息贴图就叠加完成
  112. }
  113. ENDCG
  114. }
  115. }
  116. }



最后看到效果



这样就可以实现在不同的uv坐标下,显示不同的贴图,达到贴图的叠加了。

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

闽ICP备14008679号