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.


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.