Dual Lobe BeckMann
half3 DirectBDRFXD(BRDFData brdfData, BRDFDataXD brdfDataXD, half3 normalWS, half3 lightDirectionWS, half3 viewDirectionWS,half mask) { #ifndef _SPECULARHIGHLIGHTS_OFF float3 halfDir = SafeNormalize(float3(lightDirectionWS) + float3(viewDirectionWS)); float NoH = saturate(dot(normalWS, halfDir)); half LoH = saturate(dot(lightDirectionWS, halfDir)); float d = NoH * NoH * brdfData.roughness2MinusOne + 1.00001f; half nv = saturate(dot(normalWS,lightDirectionWS)); half LoH2 = LoH * LoH; float sAO = saturate(-0.3f + nv * nv); sAO = lerp(pow(0.75, 8.00f), 1.0f, sAO); half SpecularOcclusion = sAO; half specularTermGGX = brdfData.roughness2 / ((d * d) * max(0.1h, LoH2) * brdfData.normalizationTerm); #if _USESKIN half specularTermBeckMann = (2.0 * (brdfData.roughness2) / ((d * d) * max(0.1h, LoH2) * brdfData.normalizationTerm)) * _LobeWeight * mask; half specularTerm = (specularTermGGX / 2 + specularTermBeckMann) * SpecularOcclusion ; // On platforms where half actually means something, the denominator has a risk of overflow // clamp below was added specifically to "fix" that, but dx compiler (we convert bytecode to metal/gles) // sees that specularTerm have only non-negative terms, so it skips max(0,..) in clamp (leaving only min(100,...)) #if defined (SHADER_API_MOBILE) || defined (SHADER_API_SWITCH) specularTerm = specularTerm - HALF_MIN; specularTerm = clamp(specularTerm, 0.0, 100.0); // Prevent FP16 overflow on mobiles #endif half3 color = specularTerm * brdfData.specular + brdfData.diffuse; return color; #endif #else return brdfData.diffuse; #endif }
Dual Lobe BeckMann
Tweet
Custom HDR Reflection for More Metallic.
half3 GlossyEnvironmentReflectionSkin(half3 reflectVector, half perceptualRoughness, half occlusion , half mask) { #if !defined(_ENVIRONMENTREFLECTIONS_OFF) half mip = PerceptualRoughnessToMipmapLevel(perceptualRoughness); half4 customIrradiance = SAMPLE_TEXTURECUBE_LOD(_cubemap , sampler_cubemap, reflectVector, mip); half4 encodedIrradiance = SAMPLE_TEXTURECUBE_LOD(unity_SpecCube0, samplerunity_SpecCube0, reflectVector, mip); half4 blendIrraciance = lerp(encodedIrradiance , customIrradiance , mask); #if !defined(UNITY_USE_NATIVE_HDR) half3 irradiance = DecodeHDREnvironment(blendIrraciance, unity_SpecCube0_HDR); #else half3 irradiance = blendIrraciance.rgb; #endif return irradiance * occlusion; #endif // GLOSSY_REFLECTIONS return _GlossyEnvironmentColor.rgb * occlusion; }
Custom HDR Reflection for More Metallic.
Tweet
카테고리:shader