Shader "MyShader/PBRTer3" { Properties { _Splat0 ("Layer 1", 2D) = "white" {} _Splat1 ("Layer 2", 2D) = "white" {} _Splat2 ("Layer 3", 2D) = "white" {} _BumpSplat0 ("Layer1Normalmap", 2D) = "bump" {} _BumpSplat1 ("Layer2Normalmap", 2D) = "bump" {} _BumpSplat2 ("Layer3Normalmap", 2D) = "bump" {} _Control ("Control (RGBA)", 2D) = "white" {} _Color("MainColor", Color) = (0.5,0.5,0.5,1) _NormalScale("Normal Scale", Range(0, 3)) = 1.2 _LightAdjustMin("light_adjust_min", Range(0, 2)) = 0 _LightAdjustMax("light_adjust_max", Range(0, 2)) = 1 } CGINCLUDE #include "UnityCG.cginc" sampler2D _Splat0, _Splat1, _Splat2, _BumpSplat0, _BumpSplat1, _BumpSplat2; sampler2D _Control; half4 _Splat0_ST, _Splat1_ST, _Splat2_ST; half _NormalScale, _LightAdjustMin, _LightAdjustMax; half4 _Color; half4 _GlobalLightColor; half4 _GlobalLightDir; inline float GGX2(float nh, float hl, float r) { hl = max (hl, 0.01f); float a = max(0.01f, r * r * 0.49f); float aa = a * a; float M = ((nh * aa) - nh) * nh + 1.0; float t = M * hl; t *= t; t *= (r + 0.5f); return clamp(aa / (4.0f * t), 0, 100); } ENDCG SubShader { Tags { "RenderType"="Opaque" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_fwdbase #pragma multi_compile_fog #pragma target 3.0 #pragma fragmentoption ARB_precision_hint_fastest struct a2v { float4 vertex : POSITION; float3 normal : NORMAL; float4 tangent : TANGENT; float2 texcoord : TEXCOORD0; float2 texcoord1 : TEXCOORD1; }; struct v2f { float4 pos : SV_POSITION; float4 uv : TEXCOORD0; float4 posWorld : TEXCOORD1; float3 normalDir : TEXCOORD2; float3 tangentDir : TEXCOORD3; float3 bitangentDir : TEXCOORD4; float4 splatUv0 : TEXCOORD5; float4 splatUv1 : TEXCOORD6; UNITY_FOG_COORDS(7) }; v2f vert(a2v v) { v2f o; o.posWorld = mul(unity_ObjectToWorld, v.vertex); o.pos = mul(UNITY_MATRIX_VP, o.posWorld); o.uv.xy = v.texcoord; o.uv.zw = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw; o.normalDir = mul((float3x3)unity_ObjectToWorld, v.normal); o.tangentDir = normalize(mul((float3x3)unity_ObjectToWorld, v.tangent.xyz)); o.bitangentDir = normalize(cross(o.normalDir, o.tangentDir) * v.tangent.w); o.splatUv0.xy = TRANSFORM_TEX(v.texcoord, _Splat0); o.splatUv0.zw = TRANSFORM_TEX(v.texcoord, _Splat1); o.splatUv1.xy = TRANSFORM_TEX(v.texcoord, _Splat2); UNITY_TRANSFER_FOG(o, o.pos); return o; } half4 frag (v2f i) : SV_Target { half4 splat = tex2D (_Control, i.uv.xy); half4 cBase = tex2D(_Splat0, i.splatUv0.xy) * splat.r; half4 texBump = tex2D(_BumpSplat0, i.splatUv0.xy) * splat.r; cBase += tex2D(_Splat1, i.splatUv0.zw) * splat.g; texBump += tex2D(_BumpSplat1, i.splatUv0.zw) * splat.g; cBase += tex2D(_Splat2, i.splatUv1.xy) * splat.b; texBump += tex2D(_BumpSplat2, i.splatUv1.xy) * splat.b; cBase.rgb *= cBase.rgb; half roughness = cBase.a; half metallic = texBump.a; float3x3 tangentTransform = float3x3( i.tangentDir, i.bitangentDir, i.normalDir); half3 normal = texBump.xyz * 2.0 - 1.0f; normal.xy *= _NormalScale; normal = normalize(mul(normal, tangentTransform)); half3 litDir = _GlobalLightDir.xyz; half3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz); half3 halfDir = normalize(litDir + viewDir); half ndotl = dot(normal, litDir); half nl = max(0, ndotl); half nh = clamp(dot(normal, halfDir), 0, 1); half lh = clamp(dot(litDir, halfDir), 0, 1); half3 cLit = _GlobalLightColor.rgb * nl; half3 cDiffuse = (1.0f - metallic) * cBase.rgb; float specularTerm = GGX2(nh, lh, roughness); half3 finalColor = 0; half3 diffTerm = 0; half3 lmCol = DecodeLightmap (UNITY_SAMPLE_TEX2D(unity_Lightmap, i.uv.zw)) ; finalColor += lmCol * cBase.rgb; cLit *= smoothstep (_LightAdjustMin, _LightAdjustMax, Luminance(lmCol.rgb)); diffTerm += cLit; finalColor += (specularTerm * metallic * cLit + cDiffuse * diffTerm); finalColor = sqrt(finalColor); finalColor *= _Color * 2.0f; UNITY_APPLY_FOG(i.fogCoord, finalColor); return half4(finalColor, 1); } ENDCG } } }