Unity 框架

Highlight.shader 2.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. Shader "Unlit/Highlight"
  2. {
  3. Properties{
  4. _HighlightColor("Highlight Color", Color) = (1, 1, 1, 1)
  5. _HighlightWidth("Highlight Width", Range(0, 10)) = 2
  6. _HighlightPower("HighlightPower",Range(0,10)) = 0.0
  7. }
  8. SubShader{
  9. Tags {
  10. "Queue" = "Transparent+110"
  11. "RenderType" = "Transparent"
  12. "DisableBatching" = "True"
  13. }
  14. Pass {
  15. Cull Off
  16. ZTest Less
  17. ZWrite Off //关闭深度写入
  18. Blend SrcAlpha OneMinusSrcAlpha //透明混合
  19. ColorMask RGB//写入默认渲染目标的给定通道
  20. CGPROGRAM
  21. #include "UnityCG.cginc"
  22. #pragma vertex vert
  23. #pragma fragment frag
  24. struct appdata {
  25. float4 vertex : POSITION;
  26. float3 normal : NORMAL;
  27. float3 smoothNormal : TEXCOORD3;
  28. UNITY_VERTEX_INPUT_INSTANCE_ID
  29. };
  30. struct v2f {
  31. float4 position : SV_POSITION;
  32. fixed4 color : COLOR;
  33. float3 worldNormal : NORMAL;
  34. float3 worldPos : TEXCOORD1;
  35. UNITY_VERTEX_OUTPUT_STEREO
  36. };
  37. uniform fixed4 _HighlightColor;
  38. uniform float _HighlightWidth;
  39. float _HighlightPower;
  40. v2f vert(appdata input) {
  41. v2f output;
  42. UNITY_SETUP_INSTANCE_ID(input);
  43. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
  44. //input.smoothNormal!=0?input.smoothNormal:input.normal
  45. float3 normal = any(input.smoothNormal) ? input.smoothNormal : input.normal;
  46. float3 viewPosition = UnityObjectToViewPos(input.vertex);
  47. float3 viewNormal = normalize(mul((float3x3)UNITY_MATRIX_IT_MV, normal));
  48. output.position = UnityViewToClipPos(viewPosition + viewNormal * -viewPosition.z * _HighlightWidth / 1000.0);
  49. output.worldNormal = UnityObjectToWorldNormal(input.normal);
  50. output.worldPos = mul(unity_ObjectToWorld, input.vertex).xyz;
  51. output.color = _HighlightColor;
  52. return output;
  53. }
  54. fixed4 frag(v2f input) : SV_Target {
  55. fixed3 worldNormal = normalize(input.worldNormal);
  56. fixed3 viewDir = normalize(UnityWorldSpaceViewDir(input.worldPos));
  57. fixed A = pow(saturate(1-dot(worldNormal, viewDir)), _HighlightPower);
  58. input.color.a *= A;
  59. return input.color;
  60. }
  61. ENDCG
  62. }
  63. }
  64. }