Реализация деривации функции Смита Shadowing для произвольных распределений - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь реализовать вывод маскирующей функции G_1 Смитом. Приложение Walter et al. 1 , презентация Hammons 2 и эта исследовательская работа 3 подробно говорят об этом, и я чувствую, что понимаю большинство математика за этим. Но когда дело доходит до превращения этого в код, я, кажется, не могу понять это правильно.

Некоторые из моих вопросов влекут за собой:

В первом интеграле от минус бесконечности до бесконечности по P22 ( p, q) , как я понимаю, я могу просто перебрать все свои микросферы и использовать предыдущую формулу ( P22 (p, q) = D ( m ), потому что ^ 4 (theta_m) ) и сложить их вместе для получения суммы Римана?

Насколько я понимаю, это mu ( = | cot (theta_v) | ) наклон взгляда вектор и при использовании интеграла от мю до бесконечности цель состоит в том, чтобы уменьшить угол theta_v до тех пор, пока он не станет равным нулю? описать два интеграла. В псевдокоде:

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)

Я пишу на C ++, но я был бы очень рад любому коду или подсказке, как решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...