воскресенье, 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 на этапе генерации лучей из источников света. И всё это с оптимизациями и удобствами!