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

пятница, 15 июля 2016 г.

github open source

Решил какое-то время выкладывать на GetHub свои наработки - path tracer на основе Embree.
Будет выложено:

  • ускорение на 5% на сцене с драконом путём оптимизации математических операций sqrt, pow, dot, cross, normalize. местами используются sse-варианты функций и упрощения выражений.
    https://github.com/tigrazone/embree/commit/3ad503d02bb130e876d012032f89de9c386ba8c5
  • HDRI-освещение, в том числе importance sampled
  • более удобное управление с клавиатуры и мышью
  • fast preview, которое я реализовал для предыдущей версии Embree path tracer
  • ускорение загрузки файлов с помощью буферизации файлов и хэширования по Флетчеру - упрощенные контрольные суммы Флетчера
  • Adaptive Distributed Rendering
  • Kalemen-style Metropolis Light Transport
  • расширения формата obj
  • несколько новых тестовых сцен

среда, 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 г.

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

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

вторник, 24 мая 2016 г.

c--

  • много времени потратил чтобы изменить переменные класса в методе описаном как const. хотел сделать предкалькуляцию по ходу исполнения проги. сократить, ускорить. наивный. сделал иначе и всё равно вышло быстрее, чем было
  • временами на непонятных наборах данных программа валится. APPCRASH. надо будет внимательно порассматривать под отдадчиком. оказалось что это sse-команды из кода qbvh. убрал и заработало нормально. компилировал и visual c++ и gcc 4.5 из MinGW - результат один - APPCRASH. после убирания sse-команд в обоих вариантах всё заработало без сбоев

почему не Delphi

  • OpenMP делает много работы по потокам. В Delphi придется написать самостоятельно управление кучей потоков
  • Форматы файлов многие уже воплощены
  • Много опубликовано c, c++ кода и проще компоновать
  • stl хорош. например для массива не надо ничо писать. бери vector и радуйся. для парсинга и прочей замены map использую самодельное, но во всем другом - инструментария хватает
  • профайлер Very Sleepy не понимает fpc-таблиц символов и не понятно что ж работает дольше и можно ускорять. в c++ с этим прозрачнее. и видно что вот кто у нас тут тупит 
  • оптимизации кода. Delphi-варианты одного path tracerа в 2 раза медленнее скомпилированного Lazarus. Lazarus делает могучие exe от 2мб. мне такое не годится
  • дикая временами ситуация с теми же методами мгновенной перерисовки. тысячи их и для нормальной эффективности приходится подключать библиотеки или читать о ScanLine, RawImage и подобном. в с++ лёгкая библиотека fltk на любой системе соберётся и шустро будет работать и не жрать тонны места на диске и в памяти

суббота, 9 апреля 2016 г.

идея ускорения tinyobjloader

искал в google tinyobjloader faster чтоб увидеть, что мой блог по этому запросу второй, а первым в списке стоит Mike Acton's Data-Oriented Design Workshop (2015). поискав по странице tinyobjloader и вчитавшись, понял, что 2 студента получили задание ускорить tinyobjloader. они засунули тестовую программу в профилировщик Very Sleepy и обнаружили, что тормозит зараза std::map. предложенное ими решение мне не очень подходит. я поискал упоминание std::map в файле и понимаю что могу заменить на более шустрый свой хэш. заменю и проверю, хорош ли прирост производительности. кода наверняка станет яснее и без std::map еще и, надеюсь, exe станет меньше

пятница, 18 марта 2016 г.

интересное расширение obj

в http://www.kixor.net/dev/objloader/ предложили расширение формата obj для raytracing
Sphere (non-standard):
Spheres are defined with a position vertex and two normals: one for the up normal and one for the equator normal. The length of either normal can be chosen for the sphere radius.
v 10 10 10
vn 1 0 0
vn 1 0 0
sp 1 1 2
Plane (non-standard):
Planes are defined with a position vertex and two normals: one for the rotation normal and one for the plane normal.
v 0 0 -10
vn 0 0 1
vn 1 0 0
pl 1 1 2
Light, point (non-standard):
A simple point light source. Use a material definition to set the output values.
v 10 50 0
lp 1
Light, quad (non-standard):
A 4 cornered area light.
v 0 50 0
v 10 50 0
v 10 50 10
v 0 50 10
lq 1 2 3 4
Light, disc (non-standard):
A disc-shaped arealight source. The normal specifies the direction and size of the disc.
v 0 50 0
vn 0 -1 0
ld 1 1
Camera (non-standard):
Used to define a simple camera. The 2 vertices define the camera position and the point the camera is focusing on. The normal defines the up vector.
v 0 0 -20
v 0 5 5
vn 0 1 0
c 1 2 1
принцип такой - описываются вершины, нормали, а потом выясняется что это описывали камеру и вершины изымаются из общего буфера вершин и нормалей и превращаются в описываемый обьект

также есть расширение mtl
r 0.5            # reflection amount (non-standard)
воплощу в своём рендере

я ускорил tinyobjloader!

до 25% ускорения в чтении/парсинге файлов obj и mtl, убрал медленный и устаревший код.

детально можно почитать на https://github.com/tigrazone/tinyobjloader/commit/9393eda99baae77cd6df471a41025467983a76c3
new tinyobjloader - faster

среда, 9 марта 2016 г.

как я провёл выходные

   закопался в исходник smallppm, затем попутно вспомнил реализацию bpt и 2 варианта pt на предмет, к какому из хороших реализаций-примеров добавить эксперименты с guidiing pt, с которыми не было времени разобраться и вникнуть.
   edubpt оказался на редкость интересной реализацией bpt и pt там неплохие. ускорил там всё по максимуму. еще  всмотрелся в gemspt - в нём хорошо реализован pt с реализацией материалов. возрадовался чудесам простых оптимизаций.
   пробовал запустить mmlt - гибрид keleman mlt и pssmlt с учетом importance. предрасчеты долгие вела программа, то, что посчитала, было шумное и я не понял, чем этот метод хорош. отложил пока подальше.
   читал akari2, oreoreon renderer и примерял реализации qbvh к своему vcm. понял, что основывать свой qbvh буду на akari2. внёс оптимизации в vcm. решил снова возиться с vcm как с основным.
   в oreoreon renderer qbvh строится без учета sah, он интересен тем, как реализовано пересечение и храниение треугольников и других примитивов.
   в vcm сделал заготовку для qbvh. выбросил неиспользуемый код. добавил реализацию sincos с sse из mitsuba. с удивлением обнаружил, что в vcm есть уже savePFM. не ожидал, что так популярен неизвестный мне раньше hdri-формат.

предстоит также реализовать:
  • image samplers - box, bspline, ...
  • hdri background light
  • tone mappers. раньше делал с помощью gamma и автоэкспозицией
  • по-прежнему актуально - чтение 3d-форматов. основных
  • текстуры
  • sse-ускоренные 1/, sincos
очень благотворно чтение исходников. появляется время подумать и сравнить, сделать по-другому, собрать крупицы в свой продукт. благодарю авторов embree, embree example renderer, oreoreon renderer, akari2, edubpt, gemspt

    понедельник, 7 марта 2016 г.

    из понравившегося и планы на 8 марта

    • On-line Learning of Parametric Mixture Models for Light Transport Simulation
      предлагается guided path tracing, который на уровне vcm, но без многих шаманств. посмотрел прилагающийся исходник и в очередной раз ужаснулся силе многих overqualified с++-программистов. пример использования техники там привязан к mitsuba, который сам по себе - класс на классе. чую я, что напишу на основе исходника из следующей ссылки simple_guided_pt.cpp
      guided pt состоит в том, что сначала трассируются фотоны и сохраняются в importance map. затем производится честный path tracing с минимальными добавками - перед path tracing дописать photon tracing проход и при умножении переменной, отвечающей за importance при path tracing коэффициент берётся из просчитанной importance photon map

    • smallpm: Global Illumination in 128 lines of C++
      Global illumination via Photon Mapping
      спасибо японскому товарищу за исходник ;-)
      с помощью него написать importance PHOTON MAP будет проще, чем по каракулям из исходника из предыдущей ссылки

    • kd-tree для photon mapping мне не нравится и потому буду использовать hash grid из smallppm.cpp
      к тому ж, smallppm значительно быстрее smallpm

    • у Toshiya Hachisuka нашел "Multiplexed Metropolis Light Transport"   [slides]   [code - mmlt]   [code - pssmlt]
      с исходным кодом!

    пятница, 4 марта 2016 г.

    сцена для проверки методов просчёта на каустику


    взята из проекта oreoren-rendering и назначено много стекла и треугольник с преломлением.
    просчитана с помощью photon mapping.
    считалось долго и на потолке освещение вышло отвратительного качества, да и по всей картинке - размытость и нечеткие детали, особенно в каустике.

    радует:
    • множество световых эфектов - каустики на полу, под водой, преломления через треугольник большой, сфера преломляющая, а за ней - отражающая 
    • необычная геометрия - примитивы Cuboid(цветные квадраты - один примитив) и NoiseSurface(водная поверхность - 1 примитив):
      [Cuboid]
      scale = 12 12 12
      rotate = 30 30 0
      position = 0 0 -100
      material = Black
      repeat = 7 7 7
      interval = 1
      margin = 0 0 0
      randColor = true
      [NoiseSurface]
      center = 0 -35 0
      scale = 150 3 150
      rotate = 0 0 0
      division = 2000 2000
      material = Water
      noisyHeight = true
      noisyColor = false

    материалы описаны так:
    [Material]
    name = Mirror
    color = .999 .999 .999
    refl = SPEC

    [Material]
    name = Glass
    color = 1 1 1
    refl = REFR
    refrIndex = 1.5

    [Material]
    name = Glass2
    color = 0.9 0.9 0.9
    refl = REFR
    refrIndex = 1.5

    [Material]
    name = Black
    color = 0.1 0.1 0.1
    refl = DIFF
    [Material]
    name = CornellRed
    color = .75 .25 .25
    refl = DIFF

    [Material]
    name = CornellBlue
    color = .25 .25 .75
    refl = DIFF

    [Material]
    name = CornellGray
    color = .75 .75 .75
    refl = DIFF

    [Material]
    name = Water
    refl = REFR
    color = 0.8 1.0 0.95
    refrIndex = 1.333
    8 миллионов поли
    LightSource - AREA, rectangle(4 вершины)
    примитивы - 4 Rectangle, 2 сферы, 1  Cuboid, 1   NoiseSurface, 2 модели из obj-файлов

    под катом - вариант сцены с водной гладью - наклон на пару градусов по всем осям и по y больше размер

    вторник, 23 февраля 2016 г.

    мелкие достижения

    • поправил рендеринг в файл - ppm, pfm, tga
    • поправил вывод дебаг-информации в консольном выводе
    • поменял Random-генератор на xorshift128
    • заметил необходимость переписать сохранение/загрузку файлов кэшированно
    • pfm, оказывается, hdri-формат и схож с hdr, но не настолько популярен
    • перепишу поиск пересечения луча с треугольником из недр Embree. позор! там Triangle Intersector тормозным методом Moeller Trumbore. добавлю предрасчеты динамические и будет шелестеть!

    воскресенье, 21 февраля 2016 г.

    ускорение metropolis light transport с помощью грамотного распределения нагрузки между потоками




    слева - 105 секунд, прошлый вариант
    справа - 85 секунд, новый вариант
    разница между версиями программы - почти 20 секунд!
    это составляет 105 / 85 = 124% ускорения

    скачать можно по адресу https://github.com/tigrazone/simple-mlt

    воскресенье, 7 февраля 2016 г.

    изменение курса и новый todo. обновляется

    Ввиду крутости реализации Embree, замораживаю работу по Delphi-версии рендера и концентрируюсь на рендере на основе Embree в связке c++, FLTK. Приятной особенностью есть готовность Embree к работе на Linux, Mac, Windows.
    Поддерживаются форматы файлов с изображениями ppm, pfm, exr, с подключением ImageMagik - tga, gif, jpg, png, bmp, tif
    Итак, новый список задач:
    • адаптировать к FLTK
    • быстрая загрузка obj, xml
      переписать, убрав зависимость от с++-потоков, хэширование, буферизация

      7.2.2016 поправил баг в чтении obj, в чтение mtl внёс специфичные для akari атрибуты - для тестирования сцены, которая шла в примере с akari2

      7.2.2016 добавил хэширование, буферизация не сработала. перепишу с fread

      9.2.2016 частично переписал долгие сравнения строк на хэширование. надо переписать по всему проекту


      оптимизировал и выложил на github свою версию tinyobjloader
      18.03.2016
    • metropolis light transport(Keleman style)
    • path tracing. быстрая перерисовка при перемещении камеры
      1/8 кадра, 1/4, 1/2 и полный кадр
      10.02.2016
    • russian roulette для path tracing
      20.02.2016
    • Vertex connection and merging
    • Manifoldis Next Event Estimate pdf, slides, avi. Реализовано в NANOGI
    • загрузка fbx, других форматов сцен
    • прицепить на кнопку сохранение сцены - текущее положение камеры и размеры окна
    • прицепить на кнопку сохранение отрендеренной сцены в файл
    • загрузка/сохранение файлов с изображениями
      добавить hdr
      - сохранение готово
      26.02.2016
      добавить exr(tinyexr)
      ppm, pfm, добавить tga без ImageMagik
      23.02.2106

    • добавить png, jpg, tif без ImageMagik

    hairball + hdri light in my render


    hairball.obj 230mb model - 2.88millions faces

    воскресенье, 24 января 2016 г.

    Embree крутейший!

    Наконец-то собрал и запустил у себя на компьютере Embree. Раньше он собирался, но при запуске вылетал с ошибкой. Оказалось, что мой amd не поддерживает sse4. Отключил использование sse4 и с инструкциями sse3 стал отлично работать рендер - демо-программа из пакета с Embree. На основе этой программы построю свой рендер с отличными от path tracing методами просчета и семплерами и тон-мапперами. Базис демо-рендера очень хорош и расширять его легко и можно повысить эффективность в разы.

    Скачать сборку для sse3 и sse4. Запускать crown.bat или cb1.bat и смотрите результат и скорость!

    Описание на сайте Embree http://embree.github.io/renderer.html


    Управление:
    • левая кнопка мыши - вращение(rotate)
    • средняя кнопка мыши - панорамировать(pan)
    • правая кнопка мыши - приближение/удаление камеры(dolly)
    • Ctrl+левая кнопка мыши - установить центр, относительно которого будет действовать приближение/удаление/вращение
    • Ctrl+Shift+левая кнопка мыши - изменение фокусного расстояния камеры(fov)
    • Alt+левая кнопка мыши - вращение камеры относительно поля видимости
    • L - уменьшить радиус линз на 1 единицу в пределах координат сцены
    • Shift+L - увеличить радиус линз на 1 единицу в пределах координат сцены

    воскресенье, 6 декабря 2015 г.

    любимые Инструменты

    программы-инструменты, которыми я пользуюсь большую часть дня:
    Notepad++
    Denwer
    Яндекс.браузер(из него и пишу)
    Delphi 2006 lite
    Visual C++ 2010
    Intel C++ compiler

    и реже, без сортировки по какому-то критерию:
    Open Server
    Firefox
    Chrome
    Opera 12.16
    Open Office
    Corel_DRAW_X4 + photoshop 7 (portable editions)
    PhotoshopPortable-cs6
    Adobe.Illustrator.Portable.CS6-PortableApps.com
    Fireworks MX
    Delphi 6
    Visual C++ 6(для компиляции старых, но неплохих исходников типа vaahtokarkit и WinOsi)
    Visual C++ 2013
    MinGW/Msys/gcc 4.8.1
    Keyshot 5
    Maxwell Renderer
    3ds max 2016 student
    cinema4d
    blender
    vray
    cycles
    corona

    среда, 25 ноября 2015 г.

    new todo

    1. lazarus opengl window
      • create
      • draw
      • frustrum culling
    2. lazarus mouse и клавиатура как в играх - управление сценой
    3. obj load
      • fast load
        24 nov 15
      • hashing добработать имеющуюся реализацию с adler32
      • parse
      • store in mem
      • mats
      оптимизировал и выложил на github свою версию tinyobjloader
      18.03.2016
    4. MNEE
    5. qbvh scene, tris
    6. hdr, ibl

    пятница, 30 октября 2015 г.

    поиск ника в соцсетях

    http://pepelac.xyz/psearch.php
    и обо мне http://pepelac.xyz/psearch.php?nick=tigrazone&pages=3&sleeptime=1&psycho=on&icq=on&email=on

    simple adaptive antialias pass

    1. просмотреть все соседние пикселы(если 0 по х, сравнить с пикселом сверху)
    2. сравнение пикселов
      • по каждой из x, y, z получить коэффициент отличия = min(x1,x2)/max(x1,x2)
      • если этот коэффициент > константы макс. отличия(0.3 например), то установить флаг необходимости антиалиазинга и прервать цикл по x, y, z
      • расчет точек углов, в которых затем усредняется делением на 4 получившиеся цвета в субпикселах, Java:
        float xScale = scene.viewWidth  / width;
        float yScale = scene.viewHeight / height;
        float left  = (x - 0.25f*(1.1f-rndrnd.getFloat()*0.3f)) * xScale; //(0.8 .. 1.1)/4 = 0.2 .. 0.275
        float right = (x + 0.25f*(1.1f-rndrnd.getFloat()*0.3f)) * xScale;
        float above = (y - 0.25f*(1.1f-rndrnd.getFloat()*0.3f)) * yScale;
        float below = (y + 0.25f*(1.1f-rndrnd.getFloat()*0.3f)) * yScale;

    среда, 28 октября 2015 г.

    bidirectional path tracing и ускорения

    на основе https://github.com/githole/edubpt можно потестировать некоторые ускорения для bidirectional path tracing:

    вдохновляют

    http://peterkutz.com
    http://blog.yiningkarlli.com/

    о distributed ray tracing и процедурных текстурах из старой книги




    в этой же книге - о сплайнах, текстурировании и
    процедурных текстурах!

    посмотреть pdf(5mb)

    что сделано на сейчас

    • взял чтение obj из akari2 и ускорил его в 2 раза. разбивка на фразы - strtok, затем токенизация в int с помощью adler32 и бинарный поиск. парсер obj легко расширяется новыми лексемами
    • vcm. нашел, как, регулируя количество ligthing paths, сделать рендер более bpt или sppm-based. эта настройка также делает рендеры более или менее быстрыми. меняется от этой настройки и количество шума. нужно еще поработать с нею, т.к. картинки получаются временами более тёмными. что-то не то с делением на количество реально обработанных ligthing paths
    • читаю исходники своего java renderer и беру оттуда работу с adaptive antialias
      1/4
      1/2
      с adaptive antialias

    to do

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

    итак:
    • 1/4, 1/2 превью, simple adaptive antialias pass
    • obj чтение
      1. сделать фиксированный буфер (64kb)
      2. чтение формата сделать более полным
    • qbvh для всей сцены
    • чтение сцены
    • текстуры и материалы
      1. текстуры
      2. процедурные материалы
    • opengl работа с мышью
    • в simplemlt оптимизировать Color direct_radiance_sample() ибо очень ужасно выглядит
      моя версия simplemlt https://github.com/tigrazone/simple-mlt/blob/master/simplemlt.cpp

    четверг, 2 июля 2015 г.

    vcm. небольшое ускорение

    выдалась свободная минутка и я окинул взором свою версию реализации VCM.
    нашёл несколько мест, где можно упростить алгебраически формулы, запоминать часто встречающиеся расчеты.

    вышло 5% прироста, что я считаю неплохим результатом для быстрых и простых оптимизаций.

    старый вариант

    новый вариант
    вычислял ускорение исходя из количества просчитаных лучей за одинаковое время 186 секунд.
    в первом варианте 7,89+7,86=15,75
    во втором варианте 8,32+8,29=16,61

    15,75/16,61=0,9482239614689946. если эту цифру отнять от 1, то выйдет 0,05177, то есть чуть больше 5%.





    воскресенье, 19 апреля 2015 г.

    mt_rand vs xorshift









    слева - mt_rand, справа - xorshift

    mt_rand не такой быстрый, как xorshift - это 2 алгоритма для генерации псевдослучайных чисел.

    переписал на Pascal реализацию xorshift с http://stackoverflow.com/questions/13213395/adjusting-xorshift-generator-to-return-a-number-within-a-maximum/13533895

    понедельник, 30 марта 2015 г.

    как я пишу свой рендер

    Источниками воплощенных идей для меня были:
    • Dart Renderer от David Cline, создателя алгоритма ERPT(Energy redistribution path tracing). В исходниках этого рендера я нашёл воплощение Metropolis Light Transport и, экспериментируя со случайными последовательностями и находя в последовательностях закономерности, вывел возможность настраивать Metropolis Light Transport для скорости и точности. Написан на с++.
    • Progressive Path Tracer от Bacterius. Реализация алгоритма Progressive Path Tracer на Delphi. Исходный вариант программы я переделал, ускорив расчеты сфер, треугольников, плоскостей, изменил интерфейс, добавил тоновую коррекцию. Также добавил реализацию importance sampling. 
    • SmallVCM от Tomáš Davidovič. Реализация замечательного алгоритма Vertex connection and merging, который уже реализован в рендерах Corona и Vray. Я добавил вывод изображения в окне с помощью библиотеки fltk, оптимизировал алгоритмы пересечения луча и сфер, треугольников, сделал более частое обновление и более быстрое отображение изображения. Планирую ускорить с помощью реализации ускорителя пересечения луча с обьектами сцены Bounding interval hierarchy из следующего в списке рендера. Написан на с++.
    • SunFlow от Christopher Kulla. Хороший рендер с реализацией photon mapping, path tracing, множеством обьектов и материалов, ускорителями пересечения луча со сценой kd-tree и bounding interval hierarchy. Написан на java.
    • Реализация Stochastic progressive photon mapping для GPU с поддержкой glossy-материалов, спектральным рендерингом и Motion Blur. Написан на с++. http://www.bee-www.com/gpusppm2.zip
    • и остальные списком: Arauna, WinOsi, Pane, R.I.S.E., Mitsuba

    На скриншоте - результат моей реализации SmallVCM после 1 часа 55 минуты. На фоне открыто окно браузера с сайтом www.bee-www.com с результатом Stochastic progressive photon mapping для GPU

    Не сложно догадаться, что мой рендер будет включать в себя и GPU-версию и Vertex Connection and Merging с Metropolis Light Transport на этапе генерации лучей из источников света. И всё это с оптимизациями и удобствами!