源战役客户端
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.

155 regels
4.3 KiB

1 maand geleden
  1. Shader "MyShader/PBRTer3"
  2. {
  3. Properties {
  4. _Splat0 ("Layer 1", 2D) = "white" {}
  5. _Splat1 ("Layer 2", 2D) = "white" {}
  6. _Splat2 ("Layer 3", 2D) = "white" {}
  7. _BumpSplat0 ("Layer1Normalmap", 2D) = "bump" {}
  8. _BumpSplat1 ("Layer2Normalmap", 2D) = "bump" {}
  9. _BumpSplat2 ("Layer3Normalmap", 2D) = "bump" {}
  10. _Control ("Control (RGBA)", 2D) = "white" {}
  11. _Color("MainColor", Color) = (0.5,0.5,0.5,1)
  12. _NormalScale("Normal Scale", Range(0, 3)) = 1.2
  13. _LightAdjustMin("light_adjust_min", Range(0, 2)) = 0
  14. _LightAdjustMax("light_adjust_max", Range(0, 2)) = 1
  15. }
  16. CGINCLUDE
  17. #include "UnityCG.cginc"
  18. sampler2D _Splat0, _Splat1, _Splat2, _BumpSplat0, _BumpSplat1, _BumpSplat2;
  19. sampler2D _Control;
  20. half4 _Splat0_ST, _Splat1_ST, _Splat2_ST;
  21. half _NormalScale, _LightAdjustMin, _LightAdjustMax;
  22. half4 _Color;
  23. half4 _GlobalLightColor;
  24. half4 _GlobalLightDir;
  25. inline float GGX2(float nh, float hl, float r)
  26. {
  27. hl = max (hl, 0.01f);
  28. float a = max(0.01f, r * r * 0.49f);
  29. float aa = a * a;
  30. float M = ((nh * aa) - nh) * nh + 1.0;
  31. float t = M * hl;
  32. t *= t;
  33. t *= (r + 0.5f);
  34. return clamp(aa / (4.0f * t), 0, 100);
  35. }
  36. ENDCG
  37. SubShader
  38. {
  39. Tags { "RenderType"="Opaque" }
  40. Pass
  41. {
  42. CGPROGRAM
  43. #pragma vertex vert
  44. #pragma fragment frag
  45. #pragma multi_compile_fwdbase
  46. #pragma multi_compile_fog
  47. #pragma target 3.0
  48. #pragma fragmentoption ARB_precision_hint_fastest
  49. struct a2v
  50. {
  51. float4 vertex : POSITION;
  52. float3 normal : NORMAL;
  53. float4 tangent : TANGENT;
  54. float2 texcoord : TEXCOORD0;
  55. float2 texcoord1 : TEXCOORD1;
  56. };
  57. struct v2f
  58. {
  59. float4 pos : SV_POSITION;
  60. float4 uv : TEXCOORD0;
  61. float4 posWorld : TEXCOORD1;
  62. float3 normalDir : TEXCOORD2;
  63. float3 tangentDir : TEXCOORD3;
  64. float3 bitangentDir : TEXCOORD4;
  65. float4 splatUv0 : TEXCOORD5;
  66. float4 splatUv1 : TEXCOORD6;
  67. UNITY_FOG_COORDS(7)
  68. };
  69. v2f vert(a2v v)
  70. {
  71. v2f o;
  72. o.posWorld = mul(unity_ObjectToWorld, v.vertex);
  73. o.pos = mul(UNITY_MATRIX_VP, o.posWorld);
  74. o.uv.xy = v.texcoord;
  75. o.uv.zw = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
  76. o.normalDir = mul((float3x3)unity_ObjectToWorld, v.normal);
  77. o.tangentDir = normalize(mul((float3x3)unity_ObjectToWorld, v.tangent.xyz));
  78. o.bitangentDir = normalize(cross(o.normalDir, o.tangentDir) * v.tangent.w);
  79. o.splatUv0.xy = TRANSFORM_TEX(v.texcoord, _Splat0);
  80. o.splatUv0.zw = TRANSFORM_TEX(v.texcoord, _Splat1);
  81. o.splatUv1.xy = TRANSFORM_TEX(v.texcoord, _Splat2);
  82. UNITY_TRANSFER_FOG(o, o.pos);
  83. return o;
  84. }
  85. half4 frag (v2f i) : SV_Target
  86. {
  87. half4 splat = tex2D (_Control, i.uv.xy);
  88. half4 cBase = tex2D(_Splat0, i.splatUv0.xy) * splat.r;
  89. half4 texBump = tex2D(_BumpSplat0, i.splatUv0.xy) * splat.r;
  90. cBase += tex2D(_Splat1, i.splatUv0.zw) * splat.g;
  91. texBump += tex2D(_BumpSplat1, i.splatUv0.zw) * splat.g;
  92. cBase += tex2D(_Splat2, i.splatUv1.xy) * splat.b;
  93. texBump += tex2D(_BumpSplat2, i.splatUv1.xy) * splat.b;
  94. cBase.rgb *= cBase.rgb;
  95. half roughness = cBase.a;
  96. half metallic = texBump.a;
  97. float3x3 tangentTransform = float3x3( i.tangentDir, i.bitangentDir, i.normalDir);
  98. half3 normal = texBump.xyz * 2.0 - 1.0f;
  99. normal.xy *= _NormalScale;
  100. normal = normalize(mul(normal, tangentTransform));
  101. half3 litDir = _GlobalLightDir.xyz;
  102. half3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
  103. half3 halfDir = normalize(litDir + viewDir);
  104. half ndotl = dot(normal, litDir);
  105. half nl = max(0, ndotl);
  106. half nh = clamp(dot(normal, halfDir), 0, 1);
  107. half lh = clamp(dot(litDir, halfDir), 0, 1);
  108. half3 cLit = _GlobalLightColor.rgb * nl;
  109. half3 cDiffuse = (1.0f - metallic) * cBase.rgb;
  110. float specularTerm = GGX2(nh, lh, roughness);
  111. half3 finalColor = 0;
  112. half3 diffTerm = 0;
  113. half3 lmCol = DecodeLightmap (UNITY_SAMPLE_TEX2D(unity_Lightmap, i.uv.zw)) ;
  114. finalColor += lmCol * cBase.rgb;
  115. cLit *= smoothstep (_LightAdjustMin, _LightAdjustMax, Luminance(lmCol.rgb));
  116. diffTerm += cLit;
  117. finalColor += (specularTerm * metallic * cLit + cDiffuse * diffTerm);
  118. finalColor = sqrt(finalColor);
  119. finalColor *= _Color * 2.0f;
  120. UNITY_APPLY_FOG(i.fogCoord, finalColor);
  121. return half4(finalColor, 1);
  122. }
  123. ENDCG
  124. }
  125. }
  126. }