[unity 基础教程]给着色器shader添加透明属性

来源:互联网 发布:qq号码定位软件 编辑:程序博客网 时间:2024/06/16 20:06

我有个shader文件。内容如下

  1. Shader "HSB_HSV_Colorpicker" {
  2.  
  3. Properties {
  4.  
  5. _MainTex ("Texture", 2D) = "white" {}
  6. _HueShift("HueShift", Float) = 0
  7. }
  8.  
  9. SubShader {
  10.  
  11. Tags { "RenderType" = "Opaque" }
  12.  
  13. CGPROGRAM
  14.  
  15. #pragma surface surf Lambert
  16. #pragma target 3.0
  17.  
  18.  
  19. float3 rgb_to_hsv_no_clip(float3 RGB)
  20.  
  21. {
  22.  
  23. float3 HSV;
  24.  
  25.  
  26. float minChannel, maxChannel;
  27.  
  28. if (RGB.x > RGB.y) {
  29.  
  30. maxChannel = RGB.x;
  31. minChannel = RGB.y;
  32.  
  33. }
  34.  
  35. else {
  36.  
  37. maxChannel = RGB.y;
  38. minChannel = RGB.x;
  39.  
  40. }
  41.  
  42.  
  43.  
  44. if (RGB.z > maxChannel) maxChannel = RGB.z;
  45.  
  46. if (RGB.z < minChannel) minChannel = RGB.z;
  47.  
  48.  
  49. HSV.xy = 0;
  50.  
  51. HSV.z = maxChannel;
  52.  
  53. float delta = maxChannel - minChannel; //Delta RGB value
  54.  
  55. if (delta != 0) { // If gray, leave H & S at zero
  56.  
  57. HSV.y = delta / HSV.z;
  58.  
  59. float3 delRGB;
  60.  
  61. delRGB = (HSV.zzz - RGB + 3*delta) / (6.0*delta);
  62.  
  63. if ( RGB.x == HSV.z ) HSV.x = delRGB.z - delRGB.y;
  64.  
  65. else if ( RGB.y == HSV.z ) HSV.x = ( 1.0/3.0) + delRGB.x - delRGB.z;
  66.  
  67. else if ( RGB.z == HSV.z ) HSV.x = ( 2.0/3.0) + delRGB.y - delRGB.x;
  68.  
  69. }
  70.  
  71. return (HSV);
  72.  
  73. }
  74.  
  75.  
  76.  
  77. float3 hsv_to_rgb(float3 HSV)
  78. {
  79.  
  80. float3 RGB = HSV.z;
  81.  
  82.  
  83.  
  84. float var_h = HSV.x * 6;
  85.  
  86. float var_i = floor(var_h); // Or ... var_i = floor( var_h )
  87.  
  88. float var_1 = HSV.z * (1.0 - HSV.y);
  89.  
  90. float var_2 = HSV.z * (1.0 - HSV.y * (var_h-var_i));
  91.  
  92. float var_3 = HSV.z * (1.0 - HSV.y * (1-(var_h-var_i)));
  93.  
  94. if (var_i == 0) { RGB = float3(HSV.z, var_3, var_1); }
  95.  
  96. else if (var_i == 1) { RGB = float3(var_2, HSV.z, var_1); }
  97.  
  98. else if (var_i == 2) { RGB = float3(var_1, HSV.z, var_3); }
  99.  
  100. else if (var_i == 3) { RGB = float3(var_1, var_2, HSV.z); }
  101.  
  102. else if (var_i == 4) { RGB = float3(var_3, var_1, HSV.z); }
  103.  
  104. else { RGB = float3(HSV.z, var_1, var_2); }
  105.  
  106.  
  107.  
  108. return (RGB);
  109.  
  110. }
  111.  
  112.  
  113.  
  114. struct Input {
  115.  
  116. float2 uv_MainTex;
  117.  
  118. };
  119.  
  120.  
  121.  
  122. sampler2D _MainTex;
  123.  
  124. float _HueShift;
  125.  
  126.  
  127.  
  128. void surf (Input IN, inout SurfaceOutput o) {
  129.  
  130. o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
  131.  
  132.  
  133. float3 hsv = rgb_to_hsv_no_clip(o.Albedo.xyz);
  134.  
  135. hsv.x+=_HueShift;
  136.  
  137.  
  138. if ( hsv.x > 1.0 ) { hsv.x -= 1.0; }
  139.  
  140. o.Albedo = half3(hsv_to_rgb(hsv));
  141.  
  142.  
  143.  
  144. }
  145.  
  146.  
  147.  
  148. ENDCG
  149.  
  150. }
  151.  
  152. Fallback "Diffuse"

}

我修改

  1. _MainTex ("Texture", 2D) = "white" {}
  2. Tags { "RenderType" = "Opaque" }

  1. _MainTex ("Color (RGB) Alpha (A)", 2D) = "white"
  2. Tags { "Queue"="Transparent" "RenderType"="Transparent" }

.

添加"alpha":

  1. #pragma surface surf Lambert alpha

.

在o.Albedo后添加如下...

  1. o.Alpha = tex2D (_MainTex, IN.uv_MainTex).a;

.

大功告成。