uniform float uRoughness;//粗糙度 uniform float uMetallic;//金属 uniform float uSpecular;//高光 uniform sampler2D uRadianceMap; uniform sampler2D uIrradianceMap; #define PI 3.14159265359 #define invPI 0.3183098861837697 #define invTWO_PI 0.15915494309 #define saturate(x) clamp(x, 0.0, 1.0) vec3 Diffuse_Lambert( vec3 DiffuseColor ) { return DiffuseColor * (1.0 / PI); //return vec3(0,0,0); } float D_GGX( float Roughness, float NoH ) { float m = Roughness * Roughness; float m2 = m * m; float d = ( NoH * m2 - NoH ) * NoH + 1.0; // 2 mad return m2 / ( PI*d*d ); // 4 mul, 1 rcp } float Vis_Smith( float Roughness, float NoV, float NoL ) { float a = Roughness * Roughness ; float a2 = a*a; float Vis_SmithV = NoV + sqrt( NoV * (NoV - NoV * a2) + a2 ); float Vis_SmithL = NoL + sqrt( NoL * (NoL - NoL * a2) + a2 ); return 1.0 / ( Vis_SmithV * Vis_SmithL ); } vec3 F_Schlick( vec3 SpecularColor, float VoH ) { float Fc = pow( 1.0 - VoH, 5.0 ); return Fc + (1.0 - Fc) * SpecularColor; //return saturate( 50.0 * SpecularColor.y ) * Fc + (1.0 - Fc) * SpecularColor; }