среда, 29 июня 2016 г.

The Tungsten Renderer


https://benedikt-bitterli.me/tungsten.html

ОТМЕЧУ ПОДЧЕРКИВАНИЕМ ТО, ЧТО ХОЧУ ПОЗАИМСТВОВАТЬ

Feature list

Below is an incomplete list of the features implemented in the renderer. If you're really interested, there is also the detailed (boring, outdated) project report from summer 2014.

Supported integrators
  • Bidirectional Path Tracing
  • Primary Sample Space Metropolis Light Transport
  • Progressive Photon Mapping
  • Light Tracing
  • Photon Mapping
  • Path Tracing
Material models
  • Hair
  • Smooth coat (varnish on top of configurable material)
  • Microfacet dielectric (GGX, Beckmann or Phong)
  • Microfacet conductor (GGX, Beckmann or Phong)
  • Diffuse Fibers
  • Thin-sheet dielectric
  • Rough Conductor Wires
  • Oren-Nayar
  • Plastic
  • Smooth dielectric
  • Smooth conductor
  • Alpha mapped surfaces
  • Bump mapped surfaces
  • Mixed (blend between two materials)
  • Lambert
  • Phong
In many instances, material parameters can also be specified via texture.

Shapes
  • Triangle meshes
  • Bspline curves (ribbons, cylinders, half-cylinders, camera-facing flats)
  • Spheres
  • Quads
  • Disks
  • Infinite spheres (for environment maps)
  • Infinite spherical caps (for sun-like emitters)

Camera model
  • Depth of field
  • Shaped Bokeh (configurable via texture)
  • Cateye effect
  • Chromatic aberration
  • Tone mapping (Filmic, Reinhard, Gamma)

Input formats
  • Curves: HAIR, FIBER
  • Meshes: OBJ, WO3
  • Textures: HDR, JPG, PNG, TGA, BMP, GIF
  • File save: HDR, PNG, TGA, BMP

AdaptiveDistributedRenderScene()

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

суббота, 18 июня 2016 г.

какие лучше и почему они

  • path tracing(pt), в том числе progressive - тормозной алгоритм, который выявляет нужные полезные пути долго и с трудом. стал популярен из-за обилия GPU-числодробилок, которым всё равно что молотить. надоел уже в чистом виде и в нечистом надоел тоже
  • metropolis light transport(mlt) намного больше вызывает доверия, даже в чистом виде. ибо хорош, особенно в связке с photon mapping и bidirectional path tracing. строит начальный путь и модифицирует его с помощью всевозможных мутаций. так быстро просчитывается каустика и сложные световые эффекты
  • progressive photon mapping интересен, больше даже в модификации stochastic
  • bidirectional path tracing(bidir pt) - хорош весьма, в отличии от pt соединяет пути из камеры и из ламп-эмиттеров, пользуясь хитрыми коэффициентами MIS - multiple importance sampling
  • минус всех вышеупомянутых - не обращает внимания на распределение света по лампам и потому часто стреляет лучами лампы мимо кассы, тратя на это драгоценное время. importance-техники, next event estimation и explicit light sampling (проверка видимости ламп) - помогают для более быстрого и качественного изображения
  • vertex connection and merging(vcm) - гибрид bidirectional path tracing и stochastic progressive photon mapping. выпускает фотоны строго с MIS - multiple importance sampling, но беда всё та же, что и у bidir pt - стреляет фотонами куда попало
  • моя модификация vcm, в которой будет на этапе light tracing Metropolis light transport Kalemen-style c учетом importance ламп и потому - дополнительные разбросы лучей буду делать как в psychopath

суббота, 11 июня 2016 г.

приятные пустяки

   возился с vcm и нашёл, как переписать std::sqrt на sse-вариант. ускорение вышло незначительное, но есть. и скорее всего, intel c++ версия скомпилированного кода даст одинаковый или не медленнее варианта MinGW. можно теперь добавить в pathtracer из Embree замену на sse-sqrt, sincos воплотить тоже sse-вариант.
   интересно выходит. правлю в одном testbed, затем воплощаю наработки в основном проекте. akari2 не на первом месте. еще можно в vcm QBVH-акселератор

вторник, 7 июня 2016 г.

мой новый obj

в дополнении к описанному еще:
  • Ni, которое описывает index of refraction, может содержать формулу с переменной w - текущая длина волны. в WinOsi, где подобный подход реализован, встречаются формулы
    ior = 1.400 + 250.0 / (w - 230.0)            ! index of refraction dependent from wavelength


  • cuboid, noisesurface - для подобных сцен

P.S. WinOsi ваще крутейший:
все примеры рендеринга WinOsi взяты из галереи его сайта http://winosi.onlinehome.de/Gallery.htm

идея для GPU-рендеринга

есть у меня gpusppm2.rar от Toshiya Hachisuka - воплощенное шейдерами для OpenGL stochastic progressive photon mapping - близкий родственник алгоритма vertex connection and merging. но одна беда - не работает на моём железе - некрутая у меня gpu-карта. услышал недавно, что DirectX поддерживает шейдеры даже если OpenGL версии этих прог не работают. скачал примеры с шейдерами - работает! нужно переписать gpusppm2.rar под DirectX - может это и будет прогрессивное моё направление для создания GPU-рендера

+ и - path tracer из примера Embree 2.10.0 в сравнении с example renderer из Embree 2.0.0

+ есть corona loader - можно будет загружать xml из corona render

- не читает и не поддерживает такие команды входного файла ecs:
  • -hdrilight - освещение с помощью HDRI-карт. и нет файлов для hdri-освещения
  • -radius - радиус для камеры
  • -gamma - велечина для гамма-коррекции изображения
  • -angle для camera FOV
  • -renderer - настройки для рендера
- неудобное управление клавиатурой и мышью
- нет быстрых preview-режимов, которые я дописал к embree example render
- sincosf в windows-версии Embree сделан тупейше. заменю на sse-версию

эти все минусы устраню, перенеся готовый код и адаптируя. далее - оптимизирую код для более быстрого просчета. также пересмотреть загрузку obj, xml в плане ускорения. после воплощения HDRI-освещения допишу importance sampling HDRI-карты для скорости и качества

как собрать Embree под Windows - build Embree on Windows

читал инфу с сайта Embree как же собрать с помощью Visual Studio его и примеры, пробовал - ошибки, чего-то не хватает. потратив почти целый день, собрал!
вот алгоритм построения Embree и примеров:
  1. выключил принудительно tbb в файле CMakeLists.txt. потом можно будет собрать с tbb
  2. cmake -G "Visual Studio 10 2010"
  3. у меня установлен MinGW(под ним не собиралось никак - ошибки) и в файлах проекта прописалось местами c:\dev\mingw\include - я эти строчки просто удалил, т.к. все include стандартные пробовал тягать оттуда и было море ошибок. после удаления этого пути - собирает.
  4. с помощью Visual Studio 2013 открываем и собираем embree2.sln
далее я собирал с Intel Compiler. exe и dll получились больше, но path tracer генерировал кадр быстрее в среднем на 5-6%. после упаковки с помощью upx размеры рендера с dll стала 2.5 мб - вполне приемлимо. столько обычно занимают файлы после компилятора Lazarus. удобств и о том чтоб как-то перенести в Lazarus Embree и речи быть не может пока что. можно доручить работу со сценой и пересечениями Embree и заняться чем-то более творческим вроде воплощения и тестирования новшеств

скачать Embree pathtracer с моделью дракона [103mb]
после распаковки в отдельную папку запустить dragon.bat

воскресенье, 5 июня 2016 г.

новый Embree и неожиданные находки

Вышел новый Embree!
В bin-сборке обнаружились
  • user_geometry.exe - для работы не только с треугольниками, о чем я ошибался. В версии 2.0.0 2013 года, откуда я взял демо-рендер, не было еще этого удобства. раньше нужно было возиться с исходниками Embree. посмотрел историю версий и появилось в версии 2.1.0. сейчас - брать за основу pathtracer из примера, оптимизировать и добавлять своё
  • pathtracer.exe - для построения минимального path tracer. example path tracer отличается настроенным управлением с клавиатуры и поддержкой разных материалов.
  • lazy_geometry.exe нужно еще почитать о чем это. название привлекает новизной
    *оказалось, что можно заказывать чтоб геометрия строилась и предрасчитывалась перед проверкой на пересечение с обьектом. как раз я такое люблю! буду оттуда себе брать!
  • hair_geometry.exe - долго возился, но белый экран. позже оказалось что сгенерированное что-то волосатое было вне фокуса камеры. покрутил камерой и оно нашлось и вывелось на экран
  • displacement_geometry.exe - как настраивать displacement geometry в Embree
  • curve_geometry.exe - что-то о кривых. выглядит как цветная загогулина
  • viewer.exe - просмотр моделей в bin-формате Embree и настроек камеры ecs
  • viewer_streamed.exe - то же что и предыдущее, но алгоритм отображения ambient occlusion и почему-то streamed. почитаю внимательнее
когда сохранял новый embree в папке, там обнаружился архив с asian_dragon. открыл его и увидел несколько файлов в уже известных мне по модели короны форматах. открыл этот файл и обнаружил там на 7 миллионов полигонов красного дракона.

отрендерил и вот он:

Стоит обратить работу над рендером снова к Embree, потому что за его скоростью самописными методами не угнаться. Собрать новый Embree было непросто - не обошлось от доработок и выключения TBB. Посмотрим как соберётся...

среда, 1 июня 2016 г.

как разлагается свет в спектр

 
резонно переключать рендер в режим просчета спектрального освещения при преломлении с материалом с зависящим от длины волны