1
$\begingroup$

I'm trying to implement the derivation of the masking function G_1 by Smith. The appendix of Walter et al 1, Hammons presentation 2 and this research paper 3 talk in detail about it and I feel as I do understand the majority of the math behind it. But when it comes to turning this into code I cannot seem to get it right.

Some of my questions entail:

In the first integral from minus infinity to infinity over P22(p, q), the way I understand it I can simply iterate over all of my microfacets and use the previous formular (P22(p, q) = D(m) cos^4(theta_m)) and add them together for a riemann sum?

As far as I understand is mu (= |cot(theta_v)|) the slope of the view vector and when using an integral from mu to infinity the goal is to decrease te angle of theta_v until it is zero?

The way I naivly implemented it is as an nested loop of two riemann sums that aim to describe the two integrals. In pseudocode:

calculate mu from view angle
Aux = 0.0;
//for loop uses calculation of the angle theta_v to decide termination of loop
for(float q = mu; angleof(q) > 0.0001f; q += dq)
{
   float P2 = 0.0;
   for(iterate through all maicrofacets)
   {
      calulate theta of current microfacet
      calculate cos^4(theta)
      get D of current microfacet

      P2 += D * cos^4(theta) * dp;
   }
   Aux += (q - mu) * P2 * dq;
}

Aux *= 1.0 / mu;
return 1.0 / (1.0 + Aux)

I write in C++ but I would be very happy with any kind of code or hint as to how to solve this.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.