源战役客户端
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

102 řádky
2.9 KiB

před 1 měsícem
  1. //����ͷ��ʹ�õ�shader����pdr1�ȶ�������ӰЧ����ͷ����Ⱦ����ҪUI�ĵƹ�Ч��
  2. Shader "SuYou/PDR1UI"
  3. {
  4. Properties
  5. {
  6. _MainTex("Base 2D", 2D) = "white"{}
  7. _MaskTex("Mask 2D", 2D) = "white"{}
  8. _Normal("Normal", 2D) = "white"{}
  9. _EmissionRatio("EmissionRatio", Range(0, 100)) = 1
  10. _EnvRatio("_EnvRatio", Range(0, 2)) = 0.4
  11. }
  12. SubShader
  13. {
  14. Tags{ "Queue" = "AlphaTest+50" "RenderType" = "Opaque" }
  15. Pass
  16. {
  17. Blend SrcAlpha OneMinusSrcAlpha, Zero Zero
  18. CGPROGRAM
  19. #pragma vertex vert
  20. #pragma fragment frag
  21. #include "UnityCG.cginc"
  22. #include "CommonCg.cginc"
  23. struct appdataInput
  24. {
  25. float4 vertex : POSITION;
  26. float2 uv : TEXCOORD0;
  27. float3 normal:NORMAL;
  28. float4 tangent : TANGENT;
  29. };
  30. struct v2f
  31. {
  32. float4 pos : SV_POSITION;
  33. float2 uv : TEXCOORD0;
  34. float4 posWorld : TEXCOORD1;
  35. float3 normalDir : TEXCOORD2;
  36. float3 tangentDir : TEXCOORD3;
  37. float3 bitangentDir : TEXCOORD4;
  38. };
  39. sampler2D _MainTex, _MaskTex, _Normal;
  40. float _EmissionRatio, _EnvRatio;
  41. v2f vert(appdataInput v)
  42. {
  43. v2f o;
  44. o.posWorld = mul(unity_ObjectToWorld, v.vertex);
  45. o.pos = mul(UNITY_MATRIX_VP, o.posWorld);
  46. o.uv = v.uv;
  47. o.normalDir = UnityObjectToWorldNormal(v.normal);
  48. o.tangentDir = normalize(mul((float3x3)unity_ObjectToWorld, v.tangent.xyz));
  49. o.bitangentDir = cross(o.normalDir, o.tangentDir) * v.tangent.w;
  50. return o;
  51. }
  52. float4 frag(v2f i) : SV_Target
  53. {
  54. float3 mainColor = tex2D(_MainTex, i.uv).rgb;
  55. mainColor *= mainColor;
  56. float4 maskColor = tex2D(_MaskTex, i.uv);
  57. float3 V = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
  58. float3x3 tangentTransform = float3x3(i.tangentDir, i.bitangentDir, i.normalDir);
  59. float3 N = UnpackNormal(tex2D(_Normal, i.uv));
  60. N = normalize(mul(N, tangentTransform));
  61. float Metallic = maskColor.r;
  62. float Roughness = max(maskColor.g, 0.008);
  63. half Specular = 0.5;
  64. half DielectricSpecular = 0.08 * Specular;
  65. float3 DiffuseColor = mainColor - mainColor * Metallic;
  66. float3 SpecularColor0 = (DielectricSpecular - DielectricSpecular * Metallic) + mainColor * Metallic;
  67. float3 L = _GlobalLightDir1.xyz;
  68. float3 H = normalize(L + V);
  69. float4 resultColor = 0;
  70. float NdotL = max(dot(N, L), 0.0001);
  71. float NdotV = max(dot(N, V), 0.0001);
  72. float NdotH = max(dot(N, H), 0.01);
  73. float3 SpecularColor = EnvBRDFApprox(SpecularColor0, Roughness, NdotV);
  74. float3 specular = SpecularColor * (Roughness * 0.25 + 0.25) * GGX_Mobile(Roughness, NdotH);
  75. resultColor.rgb = (DiffuseColor + specular) * _GlobalDirColor * NdotL;
  76. resultColor.rgb += _EnvRatio * mainColor;
  77. resultColor.rgb += maskColor.b * mainColor * _EmissionRatio;
  78. resultColor.rgb = sqrt(resultColor.rgb);
  79. resultColor.a = 1;
  80. return resultColor;
  81. }
  82. ENDCG
  83. }
  84. }
  85. FallBack "Diffuse"
  86. }