源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
3.7 KiB

  1. Shader "SuYou/PDR3"
  2. {
  3. Properties
  4. {
  5. _MainTex("Base 2D", 2D) = "white"{}
  6. _MaskTex("Mask 2D", 2D) = "white"{}
  7. _Normal("Normal", 2D) = "white"{}
  8. _EnvTex("Env Texture", Cube) = "" {}
  9. _CameraLightColor("CameraLightColor", Color) = (0.9,0.9,0.9,1)
  10. _EmissionRatio("EmissionRatio", Range(0, 100)) = 1
  11. _EnvTexRatio("EnvTexRatio", Range(0, 2)) = 1
  12. }
  13. SubShader
  14. {
  15. Tags {
  16. "Queue" = "AlphaTest+51" "RenderType" = "Opaque"
  17. }
  18. Pass
  19. {
  20. Blend SrcAlpha OneMinusSrcAlpha, Zero Zero
  21. CGPROGRAM
  22. #pragma vertex vert
  23. #pragma fragment frag
  24. #include "UnityCG.cginc"
  25. #include "CommonCg.cginc"
  26. struct appdataInput
  27. {
  28. float4 vertex : POSITION;
  29. float2 uv : TEXCOORD0;
  30. float3 normal:NORMAL;
  31. float4 tangent : TANGENT;
  32. };
  33. struct v2f
  34. {
  35. float4 pos : SV_POSITION;
  36. float2 uv : TEXCOORD0;
  37. float4 posWorld : TEXCOORD1;
  38. float3 normalDir : TEXCOORD2;
  39. float3 tangentDir : TEXCOORD3;
  40. float3 bitangentDir : TEXCOORD4;
  41. };
  42. sampler2D _MainTex, _MaskTex, _Normal;
  43. samplerCUBE _EnvTex;
  44. float _EmissionRatio, _EnvTexRatio;
  45. float4 _CameraLightColor;
  46. v2f vert (appdataInput v)
  47. {
  48. v2f o;
  49. o.posWorld = mul(unity_ObjectToWorld, v.vertex);
  50. o.pos = mul(UNITY_MATRIX_VP, o.posWorld);
  51. o.uv = v.uv;
  52. o.normalDir = UnityObjectToWorldNormal(v.normal);
  53. o.tangentDir = normalize(mul((float3x3)unity_ObjectToWorld, v.tangent.xyz));
  54. o.bitangentDir = cross(o.normalDir, o.tangentDir) * v.tangent.w;
  55. return o;
  56. }
  57. float4 frag(v2f i) : SV_Target
  58. {
  59. float3 mainColor = tex2D(_MainTex, i.uv).rgb;
  60. mainColor *= mainColor;
  61. float4 maskColor = tex2D(_MaskTex, i.uv);
  62. float3 V = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
  63. float3x3 tangentTransform = float3x3(i.tangentDir, i.bitangentDir, i.normalDir);
  64. float3 N = UnpackNormal(tex2D(_Normal, i.uv));
  65. N = normalize(mul(N, tangentTransform));
  66. float3 R = reflect(-V, i.normalDir);
  67. float Metallic = maskColor.r;
  68. float Roughness = max(maskColor.g, 0.008);
  69. //half3 DiffuseColor = mainColor;
  70. //half SpecularColor0 = 0.04;
  71. half Specular = 0.5;
  72. half DielectricSpecular = 0.08 * Specular;
  73. float3 DiffuseColor = mainColor - mainColor * Metallic;
  74. float3 SpecularColor0 = (DielectricSpecular - DielectricSpecular * Metallic) + mainColor * Metallic;
  75. float3 L = _GlobalLightDir.xyz; //;
  76. float3 H = normalize(L + V);
  77. float4 resultColor = 0;
  78. float NdotL = max(dot(N, L), 0.0001);
  79. float NdotV = max(dot(N, V), 0.0001);
  80. float NdotH = max(dot(N, H), 0.01);
  81. float3 SpecularColor = EnvBRDFApprox(SpecularColor0, Roughness, NdotV);
  82. float3 specular = SpecularColor * (Roughness * 0.25 + 0.25) * GGX_Mobile(Roughness, NdotH);
  83. resultColor.rgb = (DiffuseColor + specular) * _CameraLightColor * NdotL;
  84. L = _GlobalLightDir1.xyz;
  85. H = normalize(L + V);
  86. NdotL = max(dot(N, L), 0.0001);
  87. NdotH = max(dot(N, H), 0.01);
  88. specular = SpecularColor * (Roughness * 0.25 + 0.25) * GGX_Mobile(Roughness, NdotH);
  89. resultColor.rgb += (DiffuseColor + specular) * _GlobalDirColor * NdotL;
  90. resultColor.rgb += BRDFPointLights(i.posWorld.xyz, V, N, DiffuseColor, SpecularColor0, Roughness);
  91. float mipIndex = Roughness * 6;
  92. float4 rgbm = texCUBElod(_EnvTex, float4(R, mipIndex));
  93. float3 ibl = rgbm.rgb * 2;
  94. ibl *= ibl;
  95. resultColor.rgb += ibl * SpecularColor * _EnvTexRatio * maskColor.a;
  96. //resultColor.rgb += 0.4 * mainColor;
  97. resultColor.rgb += maskColor.b * mainColor * _EmissionRatio;
  98. resultColor.rgb = sqrt(resultColor.rgb);
  99. resultColor.a = 1;
  100. return resultColor;
  101. }
  102. ENDCG
  103. }
  104. }
  105. }