Hey guys, I've been trying to implement a phsically based metal kind of shader and I was wondering if what I'm doing is correct.
Have a look at my shader:
// Compute half-way-vector
float3 H =(V + L);
H = normalize(H);// normalize// Specular Fresnel Term approximation by SchlickfloatLdotH= saturate(dot(L, H));
float3 Fresnel_spec_multiplier=1.0f-FresnelReflectance;
float3 Fresnel_spec=FresnelReflectance+ exp2(log2(1.0f-LdotH)*5+ log2(Fresnel_spec_multiplier));// Normalized Blinn-Phong NDF (D)float D =0.0f;floatNdotH= saturate(dot(N, H));floatNormalizationFactor=((glossiness +2)/2);
D = exp2(log2(NdotH)* glossiness + log2(NormalizationFactor));// NormalizationFactor * pow(NdotH, glossiness)// Cook-Torrance geometry term approximation by Kelemen & Szirmay-Kalosfloat G =1.0f/(LdotH*LdotH+0.0000001f);// Microfacet BRDF f(l,v)
float3 f_microfacet =(Fresnel_spec* G * D)/4.0f;Radiance+= f_microfacet *Li*Cosine;Radiance+=ReflectionColor*Fresnel_spec;
As you can see I'm already using a custom microfacet brdf using an approximation of the cook-torrance geometry term and the fresnel factor but for the NDF just a regular blinn-phong model. Is the cook-torrance NDF actually the beckmann distribution function or is it something different ? If yes then should I rather use a precomputed distribution texture for this like it's found on here: http://http.developer.nvidia.com/GPUGems3/gpugems3_ch14.html ?
I've found this code segment for the cook-torrance NDF on pixars renderman page:
float alpha = acos(NdotH);float D = gaussConstant*exp(-(alpha*alpha)/(m*m));
alpha in this case would be NdotH and m is the microfacet H ? And the guassian constant would be something like 0.8346...? (according to what I found on wikipedia).
댓글