Я пытаюсь реализовать вывод маскирующей функции 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 ++, но я был бы очень рад любому коду или подсказке, как решить эту проблему.