пятница, 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 больше размер