|
|
- Shader "MyShader/PBRDiffuse2"
- {
- Properties {
- _Color("MainColor", Color) = (0.5,0.5,0.5,1)
- _MainTex ("Base (RGB)", 2D) = "white" {}
- [NoScaleOffset]_NmlMap("Normal Map", 2D) = "bump" {}
- _NormalScale("Normal Scale", Range(0, 3)) = 1
- [NoScaleOffset]_RMmap("Roughness(r)Metallic(g)map", 2D) = "black"{}
- _RoughnessScale("Roughness Scale", Range(0, 1)) = 1
- _MetallicScale("Metallic Scale", Range(0, 1)) = 1
- _LightAdjustMin("light_adjust_min", Range(0, 2)) = 0
- _LightAdjustMax("light_adjust_max", Range(0, 2)) = 1
- }
-
- CGINCLUDE
- #include "UnityCG.cginc"
-
- #pragma multi_compile_fwdbase
- #pragma multi_compile_fog
- #pragma fragmentoption ARB_precision_hint_fastest
-
- sampler2D _MainTex;
- sampler2D _NmlMap;
- sampler2D _RMmap;
- half _NormalScale, _RoughnessScale, _MetallicScale, _LightAdjustMin, _LightAdjustMax;
-
- half4 _MainTex_ST, _Color;
- half4 _GlobalLightColor;
- half4 _GlobalLightDir;
-
- inline float BRDFSpec(float noh, float loh, float r4, float r)
- {
- float a = (noh * noh) * (r4 - 1) + 1;
- a *= loh;
- float a2 = a * a;
- return min(32, r4 / (4 * UNITY_PI * a2 * (r + 0.5)));
- }
-
- ENDCG
-
- SubShader
- {
- Tags { "RenderType"="Opaque" }
-
- Pass
- {
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #pragma target 3.0
- #pragma fragmentoption ARB_precision_hint_fastest
-
- struct a2v
- {
- float4 vertex : POSITION;
- half3 normal : NORMAL;
- half4 tangent : TANGENT;
- half2 texcoord : TEXCOORD0;
- half2 texcoord1 : TEXCOORD1;
- };
-
- struct v2f
- {
- float4 pos : SV_POSITION;
- float4 uv : TEXCOORD0;
- float4 posWorld : TEXCOORD1;
- float3 normalDir : TEXCOORD2;
- float3 tangentDir : TEXCOORD3;
- float3 bitangentDir : TEXCOORD4;
- UNITY_FOG_COORDS(5)
- };
-
- v2f vert(a2v v)
- {
- v2f o;
- o.posWorld = mul(unity_ObjectToWorld, v.vertex);
- o.pos = mul(UNITY_MATRIX_VP, o.posWorld);
- o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
- o.uv.zw = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
-
- o.normalDir = normalize(mul((float3x3)unity_WorldToObject, v.normal));
- o.tangentDir = normalize(mul((float3x3)unity_ObjectToWorld, v.tangent.xyz));
- o.bitangentDir = cross(o.normalDir, o.tangentDir) * v.tangent.w;
-
- UNITY_TRANSFER_FOG(o, o.pos);
- return o;
- }
-
- half4 frag (v2f i) : SV_Target
- {
- half4 cBase = tex2D(_MainTex, i.uv.xy);
-
- float3x3 tangentTransform = float3x3(i.tangentDir, i.bitangentDir, i.normalDir);
- half3 normal = UnpackNormal(tex2D(_NmlMap, i.uv.xy));
- normal.xy *= _NormalScale;
- normal = normalize(mul(normal, tangentTransform));
-
- half4 texRM = tex2D(_RMmap, i.uv.xy);
- half roughness = max(texRM.r, 0.008) * _RoughnessScale;
- half metallic = texRM.g * _MetallicScale;
-
- half3 L = _GlobalLightDir.xyz;
- half3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
- half3 halfDir = normalize(L + viewDir);
-
- half nl = max(dot(normal, L), 0.001);
- half nh = max(dot(normal, halfDir), 0.01);
- half lh = max(dot(L, halfDir), 0.01);
-
- half3 cLit = _GlobalLightColor * nl;
- cBase.rgb *= cBase.rgb;
-
- half3 cDiffuse = (1.0f - metallic) * cBase.rgb;
- half3 SpecularColor = (0.04 - 0.04 * metallic) + cBase.rgb * metallic;
-
- half4 r4 = roughness * roughness;
- r4 *= r4;
-
-
- float3 specularTerm = BRDFSpec(nh, lh, r4, roughness) * SpecularColor;
- half3 lmCol = DecodeLightmap (UNITY_SAMPLE_TEX2D(unity_Lightmap, i.uv.zw)) ;
- half3 finalColor = lmCol.rgb * lmCol.rgb * cDiffuse.rgb;
- cLit *= smoothstep(_LightAdjustMin, _LightAdjustMax, Luminance(lmCol.rgb));
-
- finalColor += (specularTerm + cDiffuse)* cLit;
- finalColor = sqrt(finalColor);
-
- finalColor.rgb *= (2.0 * _Color);
- UNITY_APPLY_FOG(i.fogCoord, finalColor);
- return half4(finalColor, 1);
- }
- ENDCG
- }
-
- }
- }
|