void adaptive_distributed_render_scene( double HalfWidth,double HalfHeight, int nx,int ny,int nxSub,int nySub, double Variance, char *PicFileName) { double x,y; // sample point ray ray; // pixel ray double hx = 2.0 * HalfWidth / nx; // pixel width double hy = 2.0 * HalfHeight / ny; // pixel height double hxSub = hx / nxSub; double hySub = hy / nySub; double Disp; // dispersion squared int i,j; Vector Color; Vector Sum; Vector Mean; int Count; // make next in some higher-level module as: RenderOutFile = new Targa... targa_image *tga = new targa_image(PicFileName, nx, ny); rgb c; for(i = 0, y = HalfHeight; i < ny; i++, y -= hy) { for(j = 0, x = -HalfWidth; j < nx; j++, x += hx) { double x1 = x - 0.5 * hx; double y1 = y - 0.5 * hy; double d; Sum = 0; Disp = 0; Count = 0; TotalPixels++; do { for(int iSub = 0; iSub < nxSub; iSub++) for(int jSub = 0; jSub < nySub; jSub++) { camera(x1+hxSub*(iSub+rnd()),y1+hySub*(jSub+rnd()),ray); Color = trace( air, 1.0, ray ); Sum += Color; Disp += Color & Color; Count++; } Mean = Sum / Count; d = (Disp / Count - (Mean & Mean)) * Count / (Count - 1); } while(d / Count >= Variance && Count < 99); clip( Mean ); c.r = Mean.x * 255; c.g = Mean.y * 255; c.b = Mean.z * 255; tga->put_pixel( c ); } } delete tga; }
https://github.com/berkus/grayzer/blob/master/src/render/ADRender.cpp
и пример использования https://github.com/berkus/grayzer/blob/master/examples/exampleA/exampleA.cpp
Комментариев нет:
Отправить комментарий