getPhongDirect: "\nfn D_BlinnPhong( shininess: f32, NdotH: f32 ) -> f32 {\n return RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( NdotH, shininess );\n}\n\nfn BRDF_BlinnPhong(\n normal: vec3f,\n viewDirection: vec3f,\n specularColor: vec3f,\n shininess: f32,\n directLight: DirectLight\n) -> vec3f {\n let H: vec3f = normalize(viewDirection + directLight.direction);\n \n let NdotH: f32 = saturate(dot(normal, H));\n let VdotH: f32 = saturate(dot(viewDirection, H));\n \n let F: vec3f = F_Schlick(specularColor, 1.0, VdotH);\n let G: f32 = 0.25; // blinn phong implicit\n let D = D_BlinnPhong(shininess, NdotH);\n \n let specular: vec3f = F * G * D;\n \n return specular;\n}\n\nfn getPhongDirect(\n normal: vec3f,\n diffuseColor: vec3f,\n viewDirection: vec3f,\n specularColor: vec3f,\n specularStrength: f32,\n shininess: f32,\n directLight: DirectLight,\n ptr_reflectedLight: ptr<function, ReflectedLight>\n) {\n let NdotL = saturate(dot(normal, directLight.direction));\n \n let irradiance: vec3f = NdotL * directLight.color;\n (*ptr_reflectedLight).directDiffuse += irradiance * BRDF_Lambert( diffuseColor );\n (*ptr_reflectedLight).directSpecular += irradiance * BRDF_BlinnPhong( normal, viewDirection, specularColor, shininess, directLight ) * specularStrength;\n}\n" = ...

Helper function chunk appended internally and used to compute Phong direct light contributions.