MyBillboarding.shader 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. Shader "MyUnlit/MyBillboarding"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Texture", 2D) = "white" {}
  6. _Color("Color Tint",color)=(1,1,1,1)
  7. }
  8. SubShader
  9. {
  10. //对顶点进行变换需禁用合P
  11. Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "true" "DisableBatching" = "True" }
  12. Pass
  13. {
  14. //透明度混合
  15. Tags{ "lightmode" = "forwardbase" }
  16. ZWrite off
  17. Blend SrcAlpha OneMinusSrcAlpha
  18. Cull off
  19. CGPROGRAM
  20. #pragma vertex vert
  21. #pragma fragment frag
  22. #pragma multi_compile_fog
  23. #include "UnityCG.cginc"
  24. struct appdata
  25. {
  26. float4 vertex : POSITION;
  27. float2 uv : TEXCOORD0;
  28. };
  29. struct v2f
  30. {
  31. float2 uv : TEXCOORD0;
  32. UNITY_FOG_COORDS(1)
  33. float4 vertex : SV_POSITION;
  34. };
  35. sampler2D _MainTex;
  36. float4 _MainTex_ST;
  37. fixed4 _Color;
  38. v2f vert (appdata v)
  39. {
  40. v2f o;
  41. //计算模型空间中的视线方向
  42. float3 objViewDir = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos, 1));
  43. //计算旋转矩阵的各个基向量
  44. float3 normalDir =normalize(objViewDir);
  45. float3 upDir =float3(0, 1, 0);
  46. float3 rightDir = normalize(cross(normalDir, upDir));
  47. upDir = normalize(cross(normalDir, rightDir));
  48. //用旋转矩阵对顶点进行偏移
  49. float3 localPos =rightDir * v.vertex.x + upDir * v.vertex.y + normalDir * v.vertex.z;
  50. //将偏移之后的值作为新的顶点传递计算
  51. o.vertex = UnityObjectToClipPos(float4(localPos,1));
  52. o.uv = TRANSFORM_TEX(v.uv, _MainTex);
  53. UNITY_TRANSFER_FOG(o,o.vertex);
  54. return o;
  55. }
  56. fixed4 frag (v2f i) : SV_Target
  57. {
  58. fixed4 col = tex2D(_MainTex, i.uv);
  59. col.rgb *= _Color.rgb;
  60. UNITY_APPLY_FOG(i.fogCoord, col);
  61. return col;
  62. }
  63. ENDCG
  64. }
  65. }
  66. fallback "Transparent/VertexLit"
  67. }