源战役客户端
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

135 строки
3.8 KiB

1 месяц назад
  1. Shader "MyShader/PBRDiffuse2"
  2. {
  3. Properties {
  4. _Color("MainColor", Color) = (0.5,0.5,0.5,1)
  5. _MainTex ("Base (RGB)", 2D) = "white" {}
  6. [NoScaleOffset]_NmlMap("Normal Map", 2D) = "bump" {}
  7. _NormalScale("Normal Scale", Range(0, 3)) = 1
  8. [NoScaleOffset]_RMmap("Roughness(r)Metallic(g)map", 2D) = "black"{}
  9. _RoughnessScale("Roughness Scale", Range(0, 1)) = 1
  10. _MetallicScale("Metallic Scale", Range(0, 1)) = 1
  11. _LightAdjustMin("light_adjust_min", Range(0, 2)) = 0
  12. _LightAdjustMax("light_adjust_max", Range(0, 2)) = 1
  13. }
  14. CGINCLUDE
  15. #include "UnityCG.cginc"
  16. #pragma multi_compile_fwdbase
  17. #pragma multi_compile_fog
  18. #pragma fragmentoption ARB_precision_hint_fastest
  19. sampler2D _MainTex;
  20. sampler2D _NmlMap;
  21. sampler2D _RMmap;
  22. half _NormalScale, _RoughnessScale, _MetallicScale, _LightAdjustMin, _LightAdjustMax;
  23. half4 _MainTex_ST, _Color;
  24. half4 _GlobalLightColor;
  25. half4 _GlobalLightDir;
  26. inline float BRDFSpec(float noh, float loh, float r4, float r)
  27. {
  28. float a = (noh * noh) * (r4 - 1) + 1;
  29. a *= loh;
  30. float a2 = a * a;
  31. return min(32, r4 / (4 * UNITY_PI * a2 * (r + 0.5)));
  32. }
  33. ENDCG
  34. SubShader
  35. {
  36. Tags { "RenderType"="Opaque" }
  37. Pass
  38. {
  39. CGPROGRAM
  40. #pragma vertex vert
  41. #pragma fragment frag
  42. #pragma target 3.0
  43. #pragma fragmentoption ARB_precision_hint_fastest
  44. struct a2v
  45. {
  46. float4 vertex : POSITION;
  47. half3 normal : NORMAL;
  48. half4 tangent : TANGENT;
  49. half2 texcoord : TEXCOORD0;
  50. half2 texcoord1 : TEXCOORD1;
  51. };
  52. struct v2f
  53. {
  54. float4 pos : SV_POSITION;
  55. float4 uv : TEXCOORD0;
  56. float4 posWorld : TEXCOORD1;
  57. float3 normalDir : TEXCOORD2;
  58. float3 tangentDir : TEXCOORD3;
  59. float3 bitangentDir : TEXCOORD4;
  60. UNITY_FOG_COORDS(5)
  61. };
  62. v2f vert(a2v v)
  63. {
  64. v2f o;
  65. o.posWorld = mul(unity_ObjectToWorld, v.vertex);
  66. o.pos = mul(UNITY_MATRIX_VP, o.posWorld);
  67. o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
  68. o.uv.zw = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
  69. o.normalDir = normalize(mul((float3x3)unity_WorldToObject, v.normal));
  70. o.tangentDir = normalize(mul((float3x3)unity_ObjectToWorld, v.tangent.xyz));
  71. o.bitangentDir = cross(o.normalDir, o.tangentDir) * v.tangent.w;
  72. UNITY_TRANSFER_FOG(o, o.pos);
  73. return o;
  74. }
  75. half4 frag (v2f i) : SV_Target
  76. {
  77. half4 cBase = tex2D(_MainTex, i.uv.xy);
  78. float3x3 tangentTransform = float3x3(i.tangentDir, i.bitangentDir, i.normalDir);
  79. half3 normal = UnpackNormal(tex2D(_NmlMap, i.uv.xy));
  80. normal.xy *= _NormalScale;
  81. normal = normalize(mul(normal, tangentTransform));
  82. half4 texRM = tex2D(_RMmap, i.uv.xy);
  83. half roughness = max(texRM.r, 0.008) * _RoughnessScale;
  84. half metallic = texRM.g * _MetallicScale;
  85. half3 L = _GlobalLightDir.xyz;
  86. half3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
  87. half3 halfDir = normalize(L + viewDir);
  88. half nl = max(dot(normal, L), 0.001);
  89. half nh = max(dot(normal, halfDir), 0.01);
  90. half lh = max(dot(L, halfDir), 0.01);
  91. half3 cLit = _GlobalLightColor * nl;
  92. cBase.rgb *= cBase.rgb;
  93. half3 cDiffuse = (1.0f - metallic) * cBase.rgb;
  94. half3 SpecularColor = (0.04 - 0.04 * metallic) + cBase.rgb * metallic;
  95. half4 r4 = roughness * roughness;
  96. r4 *= r4;
  97. float3 specularTerm = BRDFSpec(nh, lh, r4, roughness) * SpecularColor;
  98. half3 lmCol = DecodeLightmap (UNITY_SAMPLE_TEX2D(unity_Lightmap, i.uv.zw)) ;
  99. half3 finalColor = lmCol.rgb * lmCol.rgb * cDiffuse.rgb;
  100. cLit *= smoothstep(_LightAdjustMin, _LightAdjustMax, Luminance(lmCol.rgb));
  101. finalColor += (specularTerm + cDiffuse)* cLit;
  102. finalColor = sqrt(finalColor);
  103. finalColor.rgb *= (2.0 * _Color);
  104. UNITY_APPLY_FOG(i.fogCoord, finalColor);
  105. return half4(finalColor, 1);
  106. }
  107. ENDCG
  108. }
  109. }
  110. }