Лекция 6::Задача 2

По-бързо изчисляване на грапави отражения (адаптивно семплиране)

В някои случаи (ако glossiness параметъра е много близо до 1, или ако отражението попада в недетаилна област на сцената, например небето), сегашния алгоритъм за грапави отражения в Reflection::computeColor() ще изстреля излишно много лъчи (резултатите от които ще са много близки по стойности и изчислението ще е ненужно прецизно). Да се реализира адаптивен алгоритъм, който прекратява изстрелването на нови лъчи, ако досега натрупаните резултати от raytrace() извикванията са "достатъчни" за точен отговор. Определянето на тази "достатъчност" направете по някой статистически критерии по ваш избор. Можете да използвате следния (но не се чувствайте задължени да ползвате точно него; свободни сте да помислите и за други схеми):

  1. Използвайте досегашния for цикъл, като на всяка итерация разглеждайте numSamples - то показва колко стойности сте събрали до момента
  2. Ако numSamples превиши някаква първоначална граница (например 4), запишете текущото приближение (sum / numSamples) някъде.
  3. Когато съберете още толкова семпъла, изчислете новото приближение и проверете - ако то е достатъчно близко до старото (например, colorDifference(oldApprox, newApprox) е под някакъв праг, да речем 0.1), то имаме сходимост, и може да прекратим семплирането дотук. В противен случай, обновете "старото" приближение с току-що изчисленото
  4. Ако реализирате този подход, поиграйте си с параметрите, които споменахме (стъпката между проверките за сходимост, и прага за цветовата разлика). Водете се от rendertime-а - при добре реализиран алгоритъм, трябва да свиете времето за рендериране наполовина, без осезаема разлика в качеството на грапавото отражение на сферата.

Comments

Искам да попитам относно

Искам да попитам относно colorDifference като нов метод ли да го задам и примерно дали това ми върши работа
float final = fabs(oldApprox - newApprox);
if (final<0.1)
return final;
Малко границата не мога да я дефинирам като хората, а и при мен рендерът се ренди адски бавно (над 3 минути) и не мога да пробвам много различни начини. Освен това в computeColor метода точно под цикълът да правя проверка, щото така пробвам и си слагам едно операторче continue или break ако ми е прага под 0.1, но какво става с кода след това ? Извинявам се ако въпросите са тъпи, но нямам възможност за много проби (много бавен рейтрйсъра е) и затова питам за малко помощ. :)

1) colorDifference() го има

1) colorDifference() го има реализирано в color.h, няма нужда да си го пишеш сам
2) Проблемът със скоростта можеш да го решиш като компилираш с оптимизации (в Release), ако още не си, и като ползваш по-ниска разделителна способност (смени RESX и RESY на 320, 200 примерно).
3) Не разбирам какво точно правиш ти в момента, но при всички случаи, проверката трябва да бъде вътре в цикъла. Какво точно става - можеш да дебъгнеш един екземпляр от computeColor и да видиш как се развива действието.

Имам проблем правя си

Имам проблем правя си алгоритъма както е обяснено ,но получавам сферата по грапава и това което е проблема е че при сменянето на параметрите няма разлика.. иначе рендър тайм-а ми се намаля 4 пъти..

Всъщност го оправих вече :)

Всъщност го оправих вече :)

Аз също се справих с

Аз също се справих с алгоритъма, но топката си стои грапава при всички стойности. Примерно аз си задавам един брояч, който ми взема стойността на numSamples и след това при втората итерация задавам праг на numSamples count*2.

На мен пък сега ми излизат

На мен пък сега ми излизат бели пиксели където трябва да е грапавото отражение :S Да попитам след като обновим "старото" приближение с току-що изчисленото трябва ли да обновим пак новото със стойност * 2 и да минем пак през проверките..

Отново го оправих извинявам

Отново го оправих извинявам се за "спаменето" :)

може ли малко хелп относно

може ли малко хелп относно грапавостта? При мен не се променя с различните стойности. Ти как го правиш да се променя? Иначе ми излиза само грапаво в голяма степен....

Еми сигурно проблема ти е в

Еми сигурно проблема ти е в алгоритъма това което си писал че се умножава брояча ти по 2 не е вярно защото идеята е на всеки count (в твоя случай ) стъпки да минаваш през проверките (както е описано в алгоритъма ) смисъл че има разлика да го умножиш по две и да продължиш цикъла и в това да му прибавиш същата стойност и да продължиш..