Unity 框架

OutlineFill.shader 1.9KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. Shader "Custom/Outline Fill" {
  2. Properties {
  3. [Enum(UnityEngine.Rendering.CompareFunction)] _ZTest("ZTest", Float) = 0
  4. _OutlineColor("Outline Color", Color) = (1, 1, 1, 1)
  5. _OutlineWidth("Outline Width", Range(0, 10)) = 2
  6. }
  7. SubShader {
  8. Tags {
  9. "Queue" = "Transparent+110"
  10. "RenderType" = "Transparent"
  11. "DisableBatching" = "True"
  12. }
  13. Pass {
  14. Name "Fill"
  15. Cull Off
  16. ZTest [_ZTest]
  17. ZWrite Off //关闭深度写入
  18. Blend SrcAlpha OneMinusSrcAlpha //透明混合
  19. ColorMask RGB//写入默认渲染目标的给定通道
  20. Stencil {
  21. Ref 1
  22. Comp NotEqual//当值不同时通过深度或模板测试
  23. }
  24. CGPROGRAM
  25. #include "UnityCG.cginc"
  26. #pragma vertex vert
  27. #pragma fragment frag
  28. struct appdata {
  29. float4 vertex : POSITION;
  30. float3 normal : NORMAL;
  31. float3 smoothNormal : TEXCOORD3;
  32. UNITY_VERTEX_INPUT_INSTANCE_ID
  33. };
  34. struct v2f {
  35. float4 position : SV_POSITION;
  36. fixed4 color : COLOR;
  37. UNITY_VERTEX_OUTPUT_STEREO
  38. };
  39. uniform fixed4 _OutlineColor;
  40. uniform float _OutlineWidth;
  41. v2f vert(appdata input) {
  42. v2f output;
  43. UNITY_SETUP_INSTANCE_ID(input);
  44. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
  45. //input.smoothNormal!=0?input.smoothNormal:input.normal
  46. float3 normal = any(input.smoothNormal) ? input.smoothNormal : input.normal;
  47. float3 viewPosition = UnityObjectToViewPos(input.vertex);
  48. float3 viewNormal = normalize(mul((float3x3)UNITY_MATRIX_IT_MV, normal));
  49. output.position = UnityViewToClipPos(viewPosition + viewNormal * -viewPosition.z * _OutlineWidth / 1000.0);
  50. output.color = _OutlineColor;
  51. return output;
  52. }
  53. fixed4 frag(v2f input) : SV_Target {
  54. return input.color;
  55. }
  56. ENDCG
  57. }
  58. }
  59. }