源战役客户端
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 

136 righe
3.8 KiB

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
}
}
}