3d форум по Blender

Другое => Программирование (любое) => Тема начата: LanuHum от 23 Июль 2016, 11:15:20

Название: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 23 Июль 2016, 11:15:20
Чтобы изучить язык программирования нужно начать писать программу на этом языке. Подходящее начало нашёл вот здесь:
https://github.com/rdavison/trayracer
https://github.com/rdavison/claytracer
Задача: допилить это для работы с Блендером добавив всё, что хочется.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 23 Июль 2016, 11:18:28
Хорошее начало... чем его надо собирать?
В общем, какой компилятор будешь пользовать? Какую IDE?

Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 23 Июль 2016, 11:51:03
Хорошее начало... чем его надо собирать?
В общем, какой компилятор будешь пользовать? Какую IDE?
Я буду использовать компилятор GCC и очень легковесную среду разработки Geany (для Windows доступна).
Если ты собираешься принять участие, то нам необходимо будет находить общие (Linux, Windows) инструменты.
claytracer использует библиотеки openCL, SDL2.
Переходим в папку с исходным кодом и собираем в линуксе командой
gcc -o claytracer -std=c11 -lOpenCL -lSDL2 -lm *.c
Чтобы посмотреть, что это за зверь такой.
У меня первый затык: версия моего линукса не стабильная, прога собралась, но не запустилась из-за отсутствия дравера nvidia.
Переустанавливаю систему. :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 23 Июль 2016, 17:49:24
Блин, забыл предупредить... у меня видюхи нет с поддержкой Open CL :( Может лучше сначала потренироваться на рендере для процессора?
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 23 Июль 2016, 18:06:38
Возник вопрос №1: Как собираешься данные из Блендера передавать в рейтресер? Это будет прямой доступ к .blend загруженному в оперативную память или реэкспорт в какой-то свой формат перед рендером?
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 23 Июль 2016, 18:27:52
Вот ещё один рейтресер на C++ https://github.com/iquadrat/raytracer
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 23 Июль 2016, 18:38:21
Вот тебе ещё инфы для размышлений (формат .blend файла)
http://www.atmind.nl/blender/mystery_ot_blend.html
http://www.atmind.nl/blender/blender-sdna-249.html
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 23 Июль 2016, 18:55:37
Блин, забыл предупредить... у меня видюхи нет с поддержкой Open CL :( Может лучше сначала потренироваться на рендере для процессора?
Я весь день потратил, чтобы добиться работоспособности своей видеокарты, но, ещё не добился. Это хорошо, что ты предложил потренироваться
Возник вопрос №1: Как собираешься данные из Блендера передавать в рейтресер? Это будет прямой доступ к .blend загруженному в оперативную память или реэкспорт в какой-то свой формат перед рендером?
Как говорится, мы лёгких путей не ищем. Если правильно расставить птицы в cmake при сборке блендера, то можно вместо гуёвины собрать библиотеку. В винде это получается ни blender.exe, а bpy.dll, в линуксе это bpy.so. Вот эту либу я и собираюсь использовать в рендерере.
Принцип в коде выглядит так:
Код
#include <python3.5m/Python.h>
#include <iostream>
#include <string>


int main(int, char **) {
    PyObject *mName, *pModule, *pFunc;
    PyObject *pArgs, *pValue, *sResult;
    Py_Initialize();
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append(\".\")");
    PyRun_SimpleString("from bimport import hello");
    mName = PyUnicode_FromString("bimport");
    char fName[] = "hello";
    pModule = PyImport_Import(mName);
    pFunc = PyObject_GetAttrString(pModule, fName);
    char fileName[] = "/home/leonid/workspace/blender/files_blend/test_so.blend";
    PyObject *pyFileName = PyBytes_FromString(fileName);
    pArgs = PyTuple_New(1);
    PyTuple_SetItem(pArgs, 0, pyFileName);
    pValue = PyObject_CallObject(pFunc, pArgs);

    double cTuple[3];

    for (int i = 0; i < 3; i++){
        sResult = PyTuple_GetItem(pValue,i);
        double cResult = PyFloat_AsDouble(sResult);
        cTuple[i] = cResult;
        }
    std::cout<<cTuple[0]<<std::endl;
    std::cout<<cTuple[1]<<std::endl;
    std::cout<<cTuple[2]<<std::endl;
    Py_Finalize();
    return 0;
}
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 23 Июль 2016, 19:13:14
Вот ещё один рейтресер на C++ https://github.com/iquadrat/raytracer
Это большой проект. Для начала без opencl подойдёт вот эта статья:
https://habrahabr.ru/post/187720/
Соответственно проект находится здесь:
https://github.com/lagodiuk/raytracing-render
Файлов очень мало, можно разобраться в принципе построения kd-tree, в использовании потоков, в антиалиасинге, зеркальности.
(https://hsto.org/storage2/668/955/91f/66895591f17671d8c1d8b7291471efc4.jpg)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 23 Июль 2016, 21:23:36
>> Это большой проект.
... а с нуля слабо?! но не просто #include #@уяк-#@уяк, а с постановки-с задачи ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 23 Июль 2016, 21:42:17
>> Это большой проект.
... а с нуля слабо?! но не просто #include #@уяк-#@уяк, а с постановки-с задачи ...
Ты будешь помогать?
Но, вот это вот с нуля слабо - это мне не нравится. Вообще мне не нравится, что человечество не накапливает опыт, а меряется перцами. Я могу плюнуть на три метра, слабо? Я на пять, слабо?
За десять лет пользования мандривой (включая потомка Магею) я только и смотрю на длину членов разработчиков. В результате чего половина срока линукс глючит. В моём понимании, знаешь, как должно быть? Блендер должен быть 2006, 2007... 2016 отличаясь лишь функциональностью, но не внешним видом. А тут появляется некий Прайс, Мрайс и давай свой конец всем показывать: А я вот так могу и вот так.
А в результате, то член длинный, то рубаха короткая. Одно сделали, другое сломали, другое кверху жопой присобачили, третье до горы раком поставили.
Так вот давай определимся, что нам нужно? Показать длину своих перцев или поставить задачу?
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 23 Июль 2016, 21:43:44
Вот тебе ещё инфы для размышлений (формат .blend файла)
http://www.atmind.nl/blender/mystery_ot_blend.html
http://www.atmind.nl/blender/blender-sdna-249.html
Вот ещё инфы от Ильи Белкина: https://docs.google.com/document/d/1VHt0flhV41fZAUuYsYqK0Vgn49KZfkekeQ39JnijC08/edit?pref=2&pli=1

Оставлю здесь. Вдруг, кому пригодится...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 23 Июль 2016, 21:46:04
>> Это большой проект.
... а с нуля слабо?! но не просто #include #@уяк-#@уяк, а с постановки-с задачи ...
С нуля слабо, увы... хотя с нуля правильней :) На счёт определения целей и постановки задачи - согласен полностью!
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 23 Июль 2016, 21:47:30
... хорошо, давайте с постановки задачи ...
... вот то что требуется сделать оно для чего и в чём цель? ...
... есть ли какое-нибудь противоречие, которое было бы решено в результате достижения поставленной цели? ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 23 Июль 2016, 21:51:46
Цитировать
... вот то что требуется сделать оно для чего и в чём цель? ...
Ну ваще, я хотел упросить Ланухумыча, попробовать сделать ГИ на разблюренных картах окружения,  что должно было дать прирост в скорости, теоретически...    но потом...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 23 Июль 2016, 21:58:16
Вот тебе ещё инфы для размышлений (формат .blend файла)
http://www.atmind.nl/blender/mystery_ot_blend.html
http://www.atmind.nl/blender/blender-sdna-249.html
Вот ещё инфы от Ильи Белкина: https://docs.google.com/document/d/1VHt0flhV41fZAUuYsYqK0Vgn49KZfkekeQ39JnijC08/edit?pref=2&pli=1

Оставлю здесь. Вдруг, кому пригодится...
Ты режешь меня без ножа. Написать нормальный парсер бинарника Блендера - это отдельный труд. Я этим заниматься не буду. Проще форкнуть Блендер и вписывать в него недостающие функции. Вот, я помню, как ты с bdancer чего-то там добивался от сетки, чтобы высвечивались только узлы с определённым количеством фейсов, принадлежащих одной вершине. Тут надо определиться, как сказал Николай, поставить задачу. ЧТО НАМ НУЖНО? ЧЕГО МЫ ХОТИМ?
Я хочу используя чей-то опыт что-то сделать. Я вижу множество начатых проектов и брошенных. Почему их бросили?
http://ariom.ru/fo/t11927.html
Это очень хорошая ссылка, но, там не говорится о дефиците общения. Человек что-то начинает, но не видя интереса извне бросает.
Это вторая сторона медали: показать кому-то, что он жил три дня ли или три года не зря.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 23 Июль 2016, 22:08:53

Да хозяин - барин, я тебя вовсе не хочу неволить ... относись к моим сообщениям как к пожеланиям, а не как указаниям, пожалуста.
Цитировать
Вот, я помню, как ты с bdancer чего-то там добивался от сетки, чтобы высвечивались только узлы с определённым количеством фейсов, принадлежащих одной вершине.
Да это моя глупость была... ещё одно ненужное никому дополнение, из-за неполного знания всех функций Блендера :) А bdancer - молодец, крут и шарит.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 23 Июль 2016, 22:17:14
... хорошо, давайте с постановки задачи ...
... вот то что требуется сделать оно для чего и в чём цель? ...
... есть ли какое-нибудь противоречие, которое было бы решено в результате достижения поставленной цели? ...
Я уже здесь на форуме упоминал Art Of Illusion. Мне нравится этот рендер.
https://www.youtube.com/watch?v=nVO1zDQc5LU
Объяснял - не тянет большое количество поликов, ибо написано на Java.
Вот она и цель.
Есть цель - ставим задачу. Задача: обогнать и перегнать Art Of Illusion.
Яфарай - не тянет большое количество поликов.
Догоним и перегоним Блюкэйма (разработчика Яфы)
С одной стороны, глупо гнаться за профи, но, с другой стороны цели Блюкэйма - не быстродействие, а показать размер члена.
То есть, я хочу сказать, что я хочу побежать рядом, но не туда.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 23 Июль 2016, 22:19:25
>> не тянет большое количество поликов
... сколько не тянет и на сколько мы хотим их обогнать? ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 23 Июль 2016, 22:27:07

Да хозяин - барин, я тебя вовсе не хочу неволить ... относись к моим сообщениям как к пожеланиям, а не как указаниям, пожалуста.
Цитировать
Вот, я помню, как ты с bdancer чего-то там добивался от сетки, чтобы высвечивались только узлы с определённым количеством фейсов, принадлежащих одной вершине.
Да это моя глупость была... ещё одно ненужное никому дополнение, из-за неполного знания всех функций Блендера :) А bdancer - молодец, крут и шарит.
Ты не придирайся к моим словам, а улавливай суть, которую я хочу до тебя донести. Все внешние рендеры общаются с Блендером посредством файлов, созданных пайтоном. Уходит время на запись и чтение. Я избавился от записи.

Bdancer крут, не крут...Он просто оказался в нужное время в нужном месте. Так бывает. А, бывает наоборот, человеку нужно было родиться в Новой Зеландии, а он родился на Чукотке.
У Блаватской это описано так: Карма не всегда может подобрать человеку нужное воплощение...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 23 Июль 2016, 22:29:59
>> не тянет большое количество поликов
... сколько не тянет и на сколько мы хотим их обогнать? ...
А, ни ты ли мне говорил про более ляма в яфе?
На сколько хотим обогнать? Ты пользовался Блендером, когда уже вьюпорт тормозит, а жмёшь (http://blender-3d.ru/forum/hotkey/f12.jpg), и оно считает? Вот нам туда.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 23 Июль 2016, 22:32:34
>> не тянет большое количество поликов
... сколько не тянет и на сколько мы хотим их обогнать? ...
А, ни ты ли мне говорил про более ляма в яфе?
На сколько хотим обогнать? Ты пользовался Блендером, когда уже вьюпорт тормозит, а жмёшь (http://blender-3d.ru/forum/hotkey/[url="modules/sections/index.php?op=viewarticle&artid=24"]http://blender-3d.ru/forum/hotkey/http://blender-3d.ru/forum/hotkey/[url="modules/sections/index.php?op=viewarticle&artid=24"][img]http://blender-3d.ru/forum/hotkey/f12.jpg).jpg.jpg[/url].jpg[/img][/url], и оно считает? Вот нам туда.
LOD (уровни детализации) не выход разве? Нахрена рендерить объект с сотней тыщь полигонов мелкий  по масштабу или удалённый на горизонте размером с несколько пикселей? Засерать его геометрией память и детализированными текстурами, если этого вообще видно не будет?
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 23 Июль 2016, 22:38:04
>> и оно считает? Вот нам туда.
... это можно пенсию пенсионер и фабрики рабочим ...
... и легче пикачу поймать чем нам туда ...
... речь ведь про поставку задачи, а не агитацию вроде ...
... то есть нужны цифры, сколько мерить в граммах, точно ...
... почему? ...
... допустим нас все устраивает кроме времени, тогда решение вопроса может лежать не только в модернизации кода, но и в улучшении Времени ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 23 Июль 2016, 22:40:53
>> и оно считает? Вот нам туда.
... это можно пенсию пенсионер и фабрики рабочим ...
... и легче пикачу поймать чем нам туда ...
... речь ведь про поставку задачи, а не агитацию вроде ...
... то есть нужны цифры, сколько мерить в граммах, точно ...
... почему? ...
... допустим нас все устраивает кроме времени, тогда решение вопроса может лежать не только в модернизации кода, но и в улучшении Времени ...
Ясно.
Давай зададим себе другой вопрос: Почему Яфа, написанная на С встречает проблему, связанную с количеством поликов?
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 23 Июль 2016, 22:48:41
>> Почему Яфа, написанная на С встречает проблему, связанную с количеством поликов?

... тогда задача - разобраться почему Яфа встречает проблему связанную с количеством поликов? ...
... есть конкретные тесты которые это демонстрируют? ...
... есть описание уже известных проблем Яфы с количеством поликов? ...
... есть объяснение разработчиков по этому вопросу? ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 23 Июль 2016, 23:02:24
>> Почему Яфа, написанная на С встречает проблему, связанную с количеством поликов?

... тогда задача - разобраться почему Яфа встречает проблему связанную с количеством поликов? ...
... есть конкретные тесты которые это демонстрируют? ...
... есть описание уже известных проблем Яфы с количеством поликов? ...
... есть объяснение разработчиков по этому вопросу? ...
Опять вопрос: Почему самого разработчика это не интересует?
Ты понимаешь, вот зачем нам Qt5? В этом есть необходимость? Была необходимость в Qt4? Была необходимость в GTK3?
Вот я показал картинки выше. Там статуя, корова, рефлектирующий пол, зеркальный шар...клик по бинарнику - секунда до появления изображения.
Я мог бы попытаться что-то узнать у Блюкэйма. Я на блендерартист дал ему код на блюдечке для рендера потомков частиц. Он, будто и не видел, а в результате воз и ныне там. Я могу в Яфе отрендерить потомков, другие - нет. Кому это стало интересно? Никому. Куда стучаться?

При чём, там, где корова, можно крутить результат в окне...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 23 Июль 2016, 23:11:15
Но, теперь в Яфе есть крутой предпросмотр материала. Вывод: Блюкэйм видел мой экспортёр в Поврей, и показал мне, что он может круче. Я до сих пор не разобрался, как он это сделал... Он мне показал длину своего члена, и, это ему только и важно.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 23 Июль 2016, 23:17:37
>> Ты понимаешь, вот зачем нам Qt5? В этом есть необходимость? Была необходимость в Qt4? Была необходимость в GTK3?
... для чего нам осина если есть берёза?! ...
... вот что мне ещё ответить ...
... тебе нужно какое-то время для формулирования постановки задачи? ...
... на самом деле в правильной постановке задачи лежит половин решения задачи и вряд ли по-другому ...
... ещё желательно, и даже очень, сделать постановку задачи как разрешения выявленного противоречия ...
... постановка задачи - путь к решению противоречия, но выявление противоречия уже очень даже неплохо ...
... тут вроде как есть опасность погрузиться в суету ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 23 Июль 2016, 23:21:24
>> Я до сих пор не разобрался, как он это сделал...
... это в тебе говорить токарь ...
... то есть опять же на слабо в узко предметной области ...
... это не плохо, но суть - догонять ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 23 Июль 2016, 23:31:22
>> Ты понимаешь, вот зачем нам Qt5? В этом есть необходимость? Была необходимость в Qt4? Была необходимость в GTK3?
... для чего нам осина если есть берёза?! ...
... вот что мне ещё ответить ...
... тебе нужно ли какое-то время для формулирования постановки задачи? ...
... на самом деле в правильной постановке задачи лежит половин решения задачи и вряд ли по-другому ...
... ещё желательно и даже очень сделать постановку задачи как разрешения выявленного противоречия ...
... постановка задачи - путь к решению противоречия, но выявление противоречия уже очень даже неплохо ...
... тут вроде как есть опасность погрузиться в суету ...
Задача: рендерер Art Of Illusion  на С++, способный вместить всю сцену Блендера. Разумеется, логично бы было портировать код, но для начала нужно понять принципы. Например, я упёрся в ThreadLocal. Что это за фигня в Джаве? Кто мне ответит? Не надо меня посылать на форумы, я там был. Я это пойму только разобравшись, как работают с ядрами и потоками С++ программисты на примерах их кодов.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 23 Июль 2016, 23:35:43
>> Я до сих пор не разобрался, как он это сделал...
... это в тебе говорить токарь ...
... то есть опять же на слабо в узко предметной области ...
... это не плохо, но суть - догонять ...
Это не совсем так. Здесь играют роль личные отношения. Ни для кого не секрет, что англоязычные проще находят общий язык. Доки по апи не блещут доступностью.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 23 Июль 2016, 23:43:10
>> Доки по апи не блещут доступностью.
... упс, новая постановка задачи?! ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 24 Июль 2016, 00:00:04
... тогда спрошу как токарь токаря, сколько нужно инструкций процессора чтобы визуализировать одну точку? ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 00:06:32
... тогда спрошу как токарь токаря, сколько нужно инструкций процессора чтобы визуализировать одну точку? ...
Чтобы ездить на автомобиле, вовсе нет необходимости знать устройство двигателя.
Встречный вопрос: Чем идея отличается от знания её осуществления?

Дабы не отвлекаться от задачи, которую я вижу, в отличие от тех, кто не видит...
Гуёвина для рендерера будет писаться с использованием libfox-1.6.
Шаблон, который я начинал писать для Sunflow:
Код
#include <map>
#include <string>
#include <algorithm>
#include <iostream>
#include <fx.h>

char buf[16];

struct point {
    int x, y;
};


#define GRID_LEN 1 // размер зерна в холсте

class PaintWindow : public FXMainWindow {
FXDECLARE(PaintWindow)

    typedef std::map<std::pair<int, int>, point> PointMap;


private:
    FXCanvas *canvas;
    FXLabel *count_label;
    FXFont *big_font;
    int isMouseDown = 0;
    FXColor drawColor = FXRGB(255, 0, 0);
    FXColor bgColor = FXRGB(0, 0, 0);
    PointMap pixels;
    void setpixel(FXEvent *event);

protected:
    PaintWindow() { }

public:

    enum {
        ID_CANVAS = FXMainWindow::ID_LAST,
    };

    long onPaint(FXObject *, FXSelector, void *);
    long onMouseDown(FXObject *, FXSelector, void *);
    long onMouseUp(FXObject *, FXSelector, void *);
    long onMouseMove(FXObject *, FXSelector, void *);

    PaintWindow(FXApp *a);

    virtual void create();

    virtual ~PaintWindow();

};

FXDEFMAP(PaintWindow) PaintWindowMap[] = { // определяем обработчики событий
        FXMAPFUNC(SEL_PAINT, PaintWindow::ID_CANVAS, PaintWindow::onPaint),
        FXMAPFUNC(SEL_LEFTBUTTONPRESS, PaintWindow::ID_CANVAS, PaintWindow::onMouseDown),
        FXMAPFUNC(SEL_RIGHTBUTTONPRESS, PaintWindow::ID_CANVAS, PaintWindow::onMouseDown),
        FXMAPFUNC(SEL_LEFTBUTTONRELEASE, PaintWindow::ID_CANVAS, PaintWindow::onMouseUp),
        FXMAPFUNC(SEL_RIGHTBUTTONRELEASE, PaintWindow::ID_CANVAS, PaintWindow::onMouseUp),
        FXMAPFUNC(SEL_MOTION, PaintWindow::ID_CANVAS, PaintWindow::onMouseMove)
};

FXIMPLEMENT(PaintWindow, FXMainWindow, PaintWindowMap, ARRAYNUMBER(PaintWindowMap))


PaintWindow::PaintWindow(FXApp *a) : FXMainWindow(a, a->getAppName(), NULL, NULL,
                                                  DECOR_ALL,
                                                  0, 0, 800, 600) {

        FXMenuBar *menubar = new FXMenuBar(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X);
        menubar->setBackColor(FXRGB(208,203,201));

        FXMenuPane *filemenu = new FXMenuPane(menubar);

        new FXMenuCommand(filemenu,"&New\tCtl-N",NULL,NULL);
        new FXMenuCommand(filemenu,"&Open\tCtl-O",NULL,NULL);
        new FXMenuCommand(filemenu,"&Save\tCtl-S",NULL,NULL);
        new FXMenuCommand(filemenu,"&Save as\t          Shift-Ctl-S",NULL,NULL);
        new FXMenuSeparator(filemenu);
        new FXMenuCommand(filemenu,"&Quit\tCtl-Q\tQuit the application.",NULL,NULL);

        new FXMenuTitle(menubar,"&File",NULL,filemenu);

        FXMenuPane *scenemenu = new FXMenuPane(menubar);

        new FXMenuCommand(scenemenu,"&Build",NULL,NULL);
        new FXMenuCheck(scenemenu,"&Build on open",NULL);
        new FXMenuSeparator(scenemenu);
        new FXMenuCommand(scenemenu,"&Render",NULL,NULL);
        new FXMenuCommand(scenemenu,"&IPR",NULL,NULL);
        new FXMenuCheck(scenemenu,"&Auto Clear Log",NULL);
        new FXMenuSeparator(scenemenu);
        new FXMenuCommand(scenemenu,"&Clear Texture Cache",NULL,NULL);
        new FXMenuCheck(scenemenu,"&Low memory triangles",NULL);

        new FXMenuTitle(menubar,"&Scene",NULL,scenemenu);

        FXMenuPane *imagemenu = new FXMenuPane(menubar);

        new FXMenuCommand(imagemenu,"&Reset Zoom",NULL,NULL);
        new FXMenuCommand(imagemenu,"&Fit to Window",NULL,NULL);
        new FXMenuSeparator(imagemenu);
        new FXMenuCommand(imagemenu,"&Save image",NULL,NULL);

        new FXMenuTitle(menubar,"&Image",NULL,imagemenu);

        FXMenuPane *helpmenu = new FXMenuPane(menubar);

        new FXMenuCommand(helpmenu,"&About Sunflow",NULL,NULL);
        new FXMenuCommand(helpmenu,"&About FOX-1.7",NULL,NULL);

        new FXMenuTitle(menubar,"&Help",NULL,helpmenu);

        FXHorizontalFrame *container=new FXHorizontalFrame(this,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED);
        container->setBackColor(FXRGB(226,223,222));
        FXHorizontalFrame *chartwell=new FXHorizontalFrame(container,FRAME_SUNKEN|LAYOUT_FILL_X|
                                                                LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT,
                                                                0,0,0,0,10,10,10,10);
        canvas = new FXCanvas(chartwell, this, ID_CANVAS, LAYOUT_FILL_X|LAYOUT_FILL_Y);

        //count_label = new FXLabel(chartwell, "...", NULL, LAYOUT_EXPLICIT, 34, 177, 133, 56);



}


PaintWindow::~PaintWindow() {

}


void PaintWindow::create() {
    FXMainWindow::create();
    show(PLACEMENT_SCREEN); //показываем окно в центре экрана
}

void PaintWindow::setpixel(FXEvent *event) {
    int x = event->win_x;
    int y = event->win_y;



    x = (event->win_x + 2) / GRID_LEN;
    y = (event->win_y + 2) / GRID_LEN;

    std::pair<int, int> p = std::make_pair(x * GRID_LEN, y * GRID_LEN); // создаём хеш из двух координат

    FXDCWindow dc(canvas);

    bool add = event->click_button == 1; // если кнопка левая, то рисуем, правой - удаляем

    dc.setForeground(add ? drawColor : bgColor);

    if (add) {
        point pixel;
        pixel.x = x * GRID_LEN;
        pixel.y = y * GRID_LEN;
        pixels[p] = pixel;
    } else {
        pixels.erase(p);
    }

    dc.fillRectangle(x * GRID_LEN, y * GRID_LEN, GRID_LEN, GRID_LEN); // рисуем квадратики

    sprintf(buf, "%lu px", pixels.size());

    //count_label->setText(buf); // обновляем надпись
}

long PaintWindow::onMouseUp(FXObject *, FXSelector, void *ptr) { // при отпускании мыши
    canvas->ungrab(); // отключаем перетаскивание в холсте
    if (isMouseDown) {
        FXDCWindow dc(canvas);
        dc.setForeground(drawColor);
        isMouseDown = 0;
    }
    return 1;
}

long PaintWindow::onMouseDown(FXObject *, FXSelector, void *ptr) { // при нажатии мыши
    canvas->grab(); // включаем перетаскивание в холсте
    setpixel((FXEvent *) ptr);
    isMouseDown = 1;
    return 1;
}


long PaintWindow::onMouseMove(FXObject *, FXSelector, void *ptr) {
    if (isMouseDown) {
        setpixel((FXEvent *) ptr);
    }
    return 1;
}


long PaintWindow::onPaint(FXObject *, FXSelector,
                          void *ptr) { //если окно сворачивается или выходит за пределы видимости, то его нужно перерисовать
    FXEvent *ev = (FXEvent *) ptr;
    FXDCWindow dc(canvas, ev);
    dc.setForeground(bgColor);
    dc.fillRectangle(ev->rect.x, ev->rect.y, ev->rect.w, ev->rect.h);

    typedef PointMap::iterator it_type;
    for (it_type iterator = pixels.begin();
         iterator != pixels.end(); iterator++) { // перебираем все пиксели наносим их на холст
        int x = iterator->second.x;
        int y = iterator->second.y;
        dc.setForeground(drawColor);
        dc.fillRectangle(x, y, GRID_LEN, GRID_LEN);

    }
    return 1;
}

using namespace std;

void usage() {
    cout << endl;
    cout <<"Usage: sunflow [options] scenefile"<< endl;
    cout << endl;
    cout <<"Options:"<< endl;
    cout << endl;
    cout <<"  -o filename      Saves the output as the specified filename (png, hdr, tga)"<< endl;
    cout <<"  -nogui           Don't open the frame showing rendering progress"<< endl;
    cout <<"  -ipr             Render using progressive algorithm"<< endl;
    cout <<"  -sampler type    Render using the specified algorithm"<< endl;
    cout <<"  -threads n       Render using n threads"<< endl;
    cout <<"  -lopri           Set thread priority to low (default)"<< endl;
    cout <<"  -hipri           Set thread priority to high"<< endl;
    cout <<"  -smallmesh       Load triangle meshes using triangles optimized for memory use"<< endl;
    cout <<"  -dumpkd          Dump KDTree to an obj file for visualization"<< endl;
    cout <<"  -buildonly       Do not call render method after loading the scene"<< endl;
    cout <<"  -showaa          Display sampling levels per pixel for bucket renderer"<< endl;
    cout <<"  -nogi            Disable any global illumination engines in the scene"<< endl;
    cout <<"  -nocaustics      Disable any caustic engine in the scene"<< endl;
    cout <<"  -pathgi n        Use path tracing with n samples to render global illumination"<< endl;
    cout <<"  -quick_ambocc d  Applies ambient occlusion to the scene with specified maximum distance"<< endl;
    cout <<"  -quick_uvs       Applies a surface uv visualization shader to the scene"<< endl;
    cout <<"  -quick_normals   Applies a surface normal visualization shader to the scene"<< endl;
    cout <<"  -quick_id        Renders using a unique color for each instance"<< endl;
    cout <<"  -quick_prims     Renders using a unique color for each primitive"<< endl;
    cout <<"  -quick_gray      Renders using a plain gray diffuse shader"<< endl;
    cout <<"  -quick_wire      Renders using a wireframe shader"<< endl;
    cout <<"  -resolution w h  Changes the render resolution to the specified width and height (in pixels)"<< endl;
    cout <<"  -aa min max      Overrides the image anti-aliasing depths"<< endl;
    cout <<"  -samples n       Overrides the image sample count (affects bucket and multipass samplers)"<< endl;
    cout <<"  -bucket n order  Changes the default bucket size to n pixels and the default order"<< endl;
    cout <<"  -bake name       Bakes a lightmap for the specified instance"<< endl;
    cout <<"  -bakedir dir     Selects the type of lightmap baking: dir=view or ortho"<< endl;
    cout <<"  -filter type     Selects the image filter to use"<< endl;
    cout <<"  -bench           Run several built-in scenes for benchmark purposes"<< endl;
    cout <<"  -rtbench         Run realtime ray-tracing benchmark"<< endl;
    cout <<"  -frame n         Set frame number to the specified value"<< endl;
    cout <<"  -anim n1 n2      Render all frames between the two specified values (inclusive)"<< endl;
    cout <<"  -translate file  Translate input scene to the specified filename"<< endl;
    cout <<"  -v verbosity     Set the verbosity level: 0=none,1=errors,2=warnings,3=info,4=detailed"<< endl;
    cout <<"  -h               Prints this message"<< endl;
}

char* getCmdOption(char ** begin, char ** end, const std::string & option)
{
    char ** itr = std::find(begin, end, option);
    if (itr != end && ++itr != end)
    {
        return *itr;
    }
    return 0;
}

bool cmdOptionExists(char** begin, char** end, const std::string& option)
{
    return std::find(begin, end, option) != end;
}

int main(int argc, char * argv[])
{
    if ( (argc <= 1) || (argv[argc-1] == NULL) ) {
        FXApp application("Sunflow", "Sunflow");
        application.init(argc, argv);
        new PaintWindow(&application);
        application.create();
        return application.run();
    }

    if(cmdOptionExists(argv, argv+argc, "-t"))
    {
        cout << "flag = t" << endl;
    }

    if(cmdOptionExists(argv, argv+argc, "--help"))
    {
        usage();
    }

    char * numthreads = getCmdOption(argv, argv + argc, "-t");

    if (numthreads)
    {
        cout << "threads = " << numthreads << endl;
    }

    char * filename = getCmdOption(argv, argv + argc, "-f");

    if (filename)
    {
        cout << "filename = " << filename << endl;
    }

    return 0;
}
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 24 Июль 2016, 00:10:51
Цитировать
Чтобы ездить на автомобиле, вовсе нет необходимости знать устройство двигателя.
Чтобы ездить - да , знаний устройства не нужно... но не чтобы модернизировать старый или создать новый  двигатель :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 00:17:59
Цитировать
Чтобы ездить на автомобиле, вовсе нет необходимости знать устройство двигателя.
Чтобы ездить - да , знаний устройства не нужно... но не чтобы модернизировать старый или создать новый двигатель :)
Как говорил Ленин: "Мы пойдём другим путём"
Не помню, кто сказал, что всё познаётся в сравнениях. У меня есть выбор, и я буду выбирать из уже готового. Мне этого достаточно. А, уж, кто захочет меня обскакать, флаг тому в руки и барабан на шею. Странные люди... вместо того, чтобы поднять бесхозное они брюзжат и изобретают велосипед...чтобы потом позвиздеть про сокеты и блоки памяти, про которые можно и не знать ничего.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 24 Июль 2016, 00:23:25
Фиг его знает, Ланухумыч... мне в школе на УПК рассказывали про АЛУ, УУ, шину данных, шину адреса и т.п. кибернетику :) ... было не очень интересно, и думал нахрен это не нужно :)  один хрен, посути архитектура компов осталась та же... теперь понимаю, что это была полезная фундаментальная инфа...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 24 Июль 2016, 00:34:04
>> Чем идея отличается от знания её осуществления?
... мы же и боремся за идею, или точнее за её спасение ...
... и для этого есть ключ - постановка задачи, она же описание мечты, но более конкретная, формальная ...
... вопрос про визуализацию точки был конкретный, то есть что нужно для этого и сколько ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 00:34:38
Фиг его знает, Ланухумыч... мне в школе на УПК рассказывали про АЛУ, УУ, шину данных, шину адреса и т.п. кибернетику :) ... было не очень интересно, и думал нахрен это не нужно :)  один хрен, посути архитектура компов осталась та же... теперь понимаю, что это была полезная фундаментальная инфа...
Я тебе ещё раз говорю, чтобы добавить фишку Блендеру не нужно изучать шины, и не нужно начинать писать новый редактор 3d  с нуля. Нужно накапливать опыт. Потому и беру fox toolkit. Это такая маленькая фигня, что даже, если завтра её кто-то захочет поставить до горы раком, как это делают GTK и Qt, я смогу оригинал поддерживать самостоятельно. У меня совсем другие мысли. Мысли, как сохранить хорошие идеи...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 24 Июль 2016, 00:38:13
>> Чем идея отличается от знания её осуществления?
... мы же и боремся за идею, или точнее за её спасение ...
... и для этого есть ключ - постановка задачи, она же описание мечты, но более конкретная, формальная ...
... вопрос про визуализацию точки был конкретный, то есть что нужно для этого и сколько ...
хороший вопрос, и очень правильный...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 00:42:21
>> Чем идея отличается от знания её осуществления?
... мы же и боремся за идею, или точнее за её спасение ...
... и для этого есть ключ - постановка задачи, она же описание мечты, но более конкретная, формальная ...
... вопрос про визуализацию точки был конкретный, то есть что нужно для этого и сколько ...
Я, наверное, туго всасываю. Вы мне про ноды для Поврея подобное чесали: концепция и тому подобное...
Повторяю, разговаривать со мной авторы бестселлеров не хотят, но это не мешает мне  читать их бестселлеры и делать свои выводы. Ещё раз повторяю идею: рендер анимации должен быть быстрым. В числах это выглядит примерно так: в 50 раз и более быстрее рендера Cycles.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 24 Июль 2016, 00:46:05
>> в 50 раз и более быстрее рендера Cycles.
... неплохо ...
... то есть также как Cycles, только быстрее? ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Милый Ад от 24 Июль 2016, 00:47:21
Цитировать
В числах это выглядит примерно так: в 50 раз и более быстрее рендера Cycles.
мож это и есть допинг с которым тебя на олимпиаду не пускают.....
мельдоний ел? признавайся.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 00:49:17
Кому ещё не ясна идея?
Рендер анимации должен осуществляться быстрее в 50 и более раз, чем это нам предлагают разработчики Блендера.
Если хотите, давайте забудем всё, что написано до этого поста. Ваши предложения: изучать шины, различия между процессорами Intel и AMD? Другие предложения есть? У меня предложение есть: взять уже созданные алгоритмы рендера быстрее в 50 раз, чем Cycles/
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Милый Ад от 24 Июль 2016, 00:51:38
фигасе!
ты чё нам от этого отказаться впариваешь?
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 00:51:47
>> в 50 раз и более быстрее рендера Cycles.
... неплохо ...
... то есть также как Cycles, только быстрее? ...
Ты сделай скриншот кадра анимации, созданной в Cycles, и скажи, нахрена ты так старался?
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 00:53:21
фигасе!
ты чё нам от этого отказаться впариваешь?
У тебя день рождения закончился?
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Милый Ад от 24 Июль 2016, 00:56:17
да ладно... раз ф году...
сломлен.офигевааю... как так можно....
и без фсякого подъёба!
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 24 Июль 2016, 00:56:30
... мои вопросы уточняющие, это нормальная практика описания постановки задачи ...
... допустим у нас есть определённое количество программистов, которым мы должны выдать задание на модернизацию кода ...
... кроме как "фас и куси" по этой теме мне сейчас сказать им нечего ...
... то есть где и что делать-то? ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 24 Июль 2016, 00:58:43
>> сломлен.офигевааю...
... ты должен быть сломлен в двойне, тёще поклон не передал, на следующий день на обед не позвал ... ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 24 Июль 2016, 01:02:30
Внутри каждой большой задачи сидит маленькая, пытающаяся пробиться наружу. (с)
LanuHum, хреново если начинается холивар из-за рендереров... на самом деле  идеального рендерера нет и не будет... каждый заточен под конкретные задачи в большей или в меньшей степени... а ускорить виз можно включая мозг на уровне моделирования, текстурирования и композа, при желании...
Но это не значит, что твоя затея с новым рендерером плоха... есть желание и интерес - вперёд...  вчера писал тебе, что смысл этого только в самообразовании (изучении C++ , если я правильно понял)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Милый Ад от 24 Июль 2016, 01:06:52
ну да.
фот Лану за полтиник..хех... он сам проболтался...
............................... тут я воздержался от высказываний.........................
Цитировать
на обед не позвал
живу не богато,  всех всем послать не смог, работа, понимашь... работа.
суета сует - а жрём - мы - её вместе,- обгладываем кости-... ну, тратим, типо, фремя....
хех,хех... да! - сдохним скоро, а от нас только этот срач и останется....
.... точки.................. точки................
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 01:13:16
... мои вопросы уточняющие, это нормальная практика описания постановки задачи ...
... допустим у нас есть определённое количество программистов, которым мы должны выдать задание на модернизацию кода ...
... кроме как "фас и куси" по этой теме мне сейчас сказать им нечего ...
... то есть где и что делать-то? ...
Это другой вопрос.
Пока я с вами тут трындел, я обнаружил, что код представленный как claytracer не рабочий. Я достучался до своей видеокарты, потестил несколько примеров, написанных для openCL...claytracer не едет...
Что тебе делать? Пока ничего, пока я не выясню, что такое threadlocal<threadcontext> на плюсах. Или, может, ты выяснишь со своей командой разработчиков, что такое threadlocal<threadcontext>?
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 24 Июль 2016, 01:15:33
>> сломлен.офигевааю...
... ты должен быть сломлен в двойне, тёще поклон не передал, на следующий день на обед не позвал ... ...
;D ;D ;D ;D ;D
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 24 Июль 2016, 01:16:42
>> живу не богато
... ты так рьяно нагибал меня за тёщу, что твоя отмазка ни в красную армию ...
... ну хоть матушке поклон бы передал ...

>> Внутри каждой большой задачи сидит маленькая, пытающаяся пробиться наружу. (с)
... есть и другое высказывание - если хотите решить частную  задачу, представьте её как решение другой более общей ...

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

... нужно ещё уточнение задачи ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 01:16:55
Внутри каждой большой задачи сидит маленькая, пытающаяся пробиться наружу. (с)
LanuHum, хреново если начинается холивар из-за рендереров... на самом деле  идеального рендерера нет и не будет... каждый заточен под конкретные задачи в большей или в меньшей степени... а ускорить виз можно включая мозг на уровне моделирования, текстурирования и композа, при желании...
Но это не значит, что твоя затея с новым рендерером плоха... есть желание и интерес - вперёд...  вчера писал тебе, что смысл этого только в самообразовании (изучении C++ , если я правильно понял)
Холивар будет, это закон. Этот закон скорей всего придумали те, кто переписывает кутю ,гэтэка и Блендер. У них свои цели, я стою у них на пути, меня надо дезориентировать...
А идеальный рендер мне не нужен, мне нужно всего лишь в 50 раз быстрей чем Cycles... :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 24 Июль 2016, 01:21:54
>> Или, может, ты выяснишь со своей командой разработчиков, что такое threadlocal<threadcontext>?
... хорошо, если не сложно и есть такая возможность напиши что делаешь и что не получается ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 24 Июль 2016, 01:32:47

Цитировать
А идеальный рендер мне не нужен, мне нужно всего лишь в 50 раз быстрей чем Cycles... :)
8)  однако :) мозх побереги :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 01:34:08
>> Или, может, ты выяснишь со своей командой разработчиков, что такое threadlocal<threadcontext>?
... хорошо, если не сложно и есть такая возможность напиши что делаешь и что не получается ...
В тайне пытаюсь ArtOfIllusion воспроизвести на плюсах.
Код на Джаве (/home/leonid/workspace/programming/aoi/java/AoIsrc302/Renderers/src/artofillusion/raytracer/Raytracer.java):
Код
  public Raytracer(Scene scene, Camera camera)
  {
    this.scene = scene;
    this.camera = camera;
    factories = PluginRegistry.getPlugins(RTObjectFactory.class);
    objectList = Collections.synchronizedList(new ArrayList<RTObject>());
    lightList = Collections.synchronizedList(new ArrayList<RTLight>());
    threadContext = new ThreadLocal<RaytracerContext>() {
      protected RaytracerContext initialValue()
      {
        return new RaytracerContext(Raytracer.this);
      }
    };
  }
Никак не пойму, что такое
Код
    threadContext = new ThreadLocal<RaytracerContext>() {
      protected RaytracerContext initialValue()
      {
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 01:36:51

Цитировать
А идеальный рендер мне не нужен, мне нужно всего лишь в 50 раз быстрей чем Cycles... :)
8)  однако :) мозх побереги :)
https://geektimes.ru/post/278470/
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 24 Июль 2016, 01:40:25
Да понял я, что ты из шизотерики не вылезал :) ...ничё, бывает, сам такой временами :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 01:49:37
Да понял я, что ты из шизотерики не вылезал :) ...ничё, бывает, сам такой временами :)
Неправильно сказать: "Дурак тот, кто из шизотерики вылез"
Ибо, как сказал Сократ:" Я хотя бы знаю, что я ничего не знаю, а этот и того не ведает"
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 24 Июль 2016, 01:51:18
:) верно
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 01:59:20
:) верно
Если б ты только знал, сколько раз я уже всё бросал...
"Если бы я захотел потрясти это дерево, я бы не смог, но ветер невидимыми нитями гнёт и терзает его"
Так говорил Заратустра.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 24 Июль 2016, 02:11:46
Ну не ломает же :) ...
Хватит  околонаучного бреда...:) Ты чего думаешь делать дальше? Всерьёз возьмёшься  за предложенный тобой последний рендерер на C++, или ...?
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 02:27:21
Ну не ломает же :) ...
Хватит  околонаучного бреда...:) Ты чего думаешь делать дальше? Всерьёз возьмёшься  за предложенный тобой последний рендерер на C++, или ...?
Да, нужно с ним разбираться. Сначала попытаюсь загружать меш из блендера, затем в него нужно впилить стекло.
Когда ты спишь?
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 24 Июль 2016, 02:28:15
когда придётся :)   временами...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Милый Ад от 24 Июль 2016, 03:09:01
>> сломлен.офигевааю...
... ты должен быть сломлен в двойне, тёще поклон не передал, на следующий день на обед не позвал ... ...
;D ;D ;D ;D ;D
фот так  sungreen чуваки свечку держат.... переживают....
у вас чё, губа не закатывается....
не могу с этим помочь.
......................
вы фот над моей МАМКОЙ постеблись....
... СССУКИ! - ВЫ ССУКИ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 а к своей хоть позвонили - гавнюки...
.........................
скокож в вас говна....
епт....
да ладно про куда мир катится - вы гавно.
пидоры - если у кого и шевельнётся в моске , что он - гавно, я ешо подумаю...
сссуки - щлите мну - а МАТЬ и МАТЬ моей ЖЕНЫ - руки прочь - ебучие унитазы....
сссук4а вы блять хоть ...........
идите...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 24 Июль 2016, 03:13:53
>> сломлен.офигевааю...
... ты должен быть сломлен в двойне, тёще поклон не передал, на следующий день на обед не позвал ... ...
;D ;D ;D ;D ;D
фот так  sungreen чуваки свечку держат.... переживают....
у вас чё, губа не закатывается....
не могу с этим помочь.
......................
вы фот над моей МАМКОЙ постеблись.... а к своей хоть позвонили - гавнюки...
.........................
скокож в вас говна....
обратись к врачу психиатру...скорее всего не в нас проблема... серьёзно.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Милый Ад от 24 Июль 2016, 03:16:47
иди на хуй.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Милый Ад от 24 Июль 2016, 03:20:26
вы чё ссуки до МАТЕРЕЙ докатились?!
Самовар - иди нахуй!
у нас теперь принято мать не чтить и отца?
вы чё ссуки сосвем ох...ли...
клёфа....
как теперь форум звать?...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 24 Июль 2016, 03:27:24
Читай по по буквам: ТЕБЕПИЗДА,  если не сходишь к психиатру...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Милый Ад от 24 Июль 2016, 04:46:18
да.
я болен.
я болен неприкосновенностью к МАМЕ, к МАМЕ моей супруги и к Матери моих детей!
а ВЫ - ублюдки - утратили свои корни и фознеслись до непес,
но водички попить - спуститься придётся ... к мамке нырнуть....
епт....
неужели я знаком с людьми - которые срут на свою МАТЬ?
.................................................
мож вы чуваки заигрались, да пизданули неподумавши....
.............................
хорошо - я согласен - я болен!
не исправимо болен!
и я не хочу от этого лечиться!
идите на ...й!
...................................
фот...
господа, не открывайте душу срач нету.
какой нибуть ублюдок подумает, что вы недостаточно заботитесь о МАМЕ, да, а про ПАПУ ему ваще несрать....
это я к тому -
НЕ В КОЕМ СЛУЧАЕ НЕ ДЕЛИТЕСЬ ЛИЧНОЙ ИНФОРМАЦИЕЙ!!!
в данном случае обошлось небольшим поносом и не популярными словами,
НО. МОГЛО БЫТЬ ГОРАЗДО ХУЖЕ!
злоумышленник может воспользоваться этой информацией и
проникнуть в ваше жилище итд....
...............................
нет злых людей!
но!
есть добрые люди!
и некоторым из них, кажется, что они добрее других и поэтому
им позволено гораздо больше
нежили -простым - добрым людям....
...итдвсберегательнойкассе....
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 24 Июль 2016, 05:00:24

Милый Ад, у тебя башка на голове, которой ты думаешь, или ты только в неё ешь? :)

Ну попроси админа устроить рефернедум по бану для Самовара... думаю, тебе твой друг не откажет в этом :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Милый Ад от 24 Июль 2016, 05:17:19
Самовар. ты РУССКИХ букв не понимаешь.
тебе ведь говорили что к чему.
мне пофиг что будет с тобой.
однако я переживаю за самого себя (фот такой я эгоист)
я совсем не хочу расстаться с этим форумом!
он мне дорог - как открытие Блена, знакомство с  sungreen...
с терпеливыми ответами на мои дебильные вопросы.....
однако то что я сейчас тебе пишу, на мой взгляд, достойно бана....
остаётся уповать на мудрость и терпение нашего админа, которое действительно
ДОСТОЙНО УВАЖЕНИЯ!
... и что уж точно - не следует в наш срач вплетать ИМЯ ЕГО)))
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 24 Июль 2016, 05:29:38
Цитировать
Самовар. ты РУССКИХ букв не понимаешь.
я нациков  КАК ТЫ не понимаю...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Милый Ад от 24 Июль 2016, 05:37:56
.... епт...
чё, опять укропы по углам....
вот это несознанка!
класс! браво!
а можно ещё такой травы?
......................
рад за тебя!
ведь жить и осознавать кто ты такой не всем под силу!
и тут самое то - уйти в несознанку - иначе дальнейшее
 существование организма будет под большой угрозой.
ведь люди - все - добрые!
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 24 Июль 2016, 05:39:26
а с каких пор для того чтобы быть нациком, надо быть укропом?  тупишь , штоле? :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Милый Ад от 24 Июль 2016, 05:51:36
а кем надо быть, что б
Цитировать
я нациков  КАК ТЫ не понимаю...
или кем не надо быть....
какие признаки его?
как ты делаешь вывод - научи!
я так не могу.
научи как нацика выявить.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 24 Июль 2016, 08:09:40
>> В тайне пытаюсь ArtOfIllusion воспроизвести на плюсах.
... перенос кода это очень неблагодарная работа ...
... наверное нужно в этой затее учесть работу сборщика мусора в java и в самом простом варианте возможна утечка памяти ...
... то есть перенесённый код будет очень похож на правильный и будет даже работать, но недолго ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 24 Июль 2016, 08:15:30
>> Или, может, ты выяснишь со своей командой разработчиков, что такое threadlocal<threadcontext>?
... хорошо, если не сложно и есть такая возможность напиши что делаешь и что не получается ...
В тайне пытаюсь ArtOfIllusion воспроизвести на плюсах.
Код на Джаве (/home/leonid/workspace/programming/aoi/java/AoIsrc302/Renderers/src/artofillusion/raytracer/Raytracer.java):
Код
  public Raytracer(Scene scene, Camera camera)
  {
    this.scene = scene;
    this.camera = camera;
    factories = PluginRegistry.getPlugins(RTObjectFactory.class);
    objectList = Collections.synchronizedList(new ArrayList<RTObject>());
    lightList = Collections.synchronizedList(new ArrayList<RTLight>());
    threadContext = new ThreadLocal<RaytracerContext>() {
      protected RaytracerContext initialValue()
      {
        return new RaytracerContext(Raytracer.this);
      }
    };
  }
Никак не пойму, что такое
Код
    threadContext = new ThreadLocal<RaytracerContext>() {
      protected RaytracerContext initialValue()
      {
... поясни проблему ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 09:09:23


>> В тайне пытаюсь ArtOfIllusion воспроизвести на плюсах.
... перенос кода это очень неблагодарная работа ...
... наверное нужно в этой затее учесть работу сборщика мусора в java и в самом простом варианте возможна утечка памяти ...
... то есть перенесённый код будет очень похож на правильный и будет даже работать, но недолго ...
... поясни проблему ...
Не пойму, что должен возвратит
Про delete в С++ я знаю. И, главное, чтоб хоть как-то заработало, чтоб понять, как оно работает. В нерабочем коде я не могу разбираться.
Я ходил вот сюда:
http://ray-tracing.ru/articles181.html
Ну и что? Это теория. А, когда я ковыряюсь в рабочем коде, я начинаю понимать, как это дерево строится. А, как написать этот код правильно согласно языку программирования - это уже другой вопрос.
А проблему в коде я показал, я не знаю откуда берётся и что создаёт этот ThreadLocal<RaytracerContext>() и почему оно вызывает initialValue(), которого в классе RaytracerContext я что-то не вижу
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 24 Июль 2016, 09:13:56
Цитировать
Я ходил вот сюда:
http://ray-tracing.ru/articles181.html
Ну и что? Это теория. А, когда я ковыряюсь в рабочем коде, я начинаю понимать, как это дерево строится. А, как написать этот код правильно согласно языку программирования - это уже другой вопрос.
Сходи и сюда для разнообразия:  http://www.enlight.ru/faq3d/content.htm
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 09:37:30
Сходи и сюда для разнообразия:  http://www.enlight.ru/faq3d/content.htm
Ага, это можно почитать. Благодарю.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 24 Июль 2016, 09:47:21
>> и почему оно вызывает initialValue(), которого в классе RaytracerContext я что-то не вижу
... так в этом коде нет вызова, это описание метода, не так ли? ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: bdancer от 24 Июль 2016, 10:02:25
Цитировать
Bdancer крут, не крут...Он просто оказался в нужное время в нужном месте.
Это в каком же, интересно, месте я оказался-то?

Цитировать
А проблему в коде я показал, я не знаю откуда берётся и что создаёт этот ThreadLocal<RaytracerContext>() и почему оно вызывает initialValue(), которого в классе RaytracerContext я что-то не вижу
https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadLocal.html
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 10:07:30
>> и почему оно вызывает initialValue(), которого в классе RaytracerContext я что-то не вижу
... так в этом коде нет вызова, это описание метода, не так ли? ...
Описание метода разве не подразумевает понимание того, что мы собираемся делать?
Если написано:
lightList = Collections.synchronizedList(new ArrayList<RTLight>());
мы видим, что будет создаваться список источников света
objectList = Collections.synchronizedList(new ArrayList<RTObject>());
мы видим, что будет создаваться список объектов для рендеринга.
Что будет создавать ThreadLocal?
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 10:11:50
Цитировать
Это в каком же, интересно, месте я оказался-то?
Я же написал: В НУЖНОМ. Я вот в ненужном для меня месте, а ты в нужном для тебя. Чё неясно-то? Хотел уже оскорбиться? :) :) :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 10:14:38
https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadLocal.html
Ты уже давным давно ещё на БУ мне признался, что ты страшный и злой. :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 24 Июль 2016, 10:21:36
Да, надо разбираться с распараллеливанием вычислений в плюсах, потом, возможно, прояснится, как работает ThreadLocal в Java ???
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 30 Июль 2016, 22:19:37
... тогда спрошу как токарь токаря, сколько нужно инструкций процессора чтобы визуализировать одну точку? ...
вопрос конкретный, конечно, но пока я его рассматриваю как риторический :)

Итак, вернёмся к нашим "тараканам"...если ещё желание у автора темы не пропало ковырять C++
Набросал маленькую программку на FreeBasic:

Код


Dim As Integer hor=800, vert=600, count   '' определение целых переменных
Dim As Double start=Timer                          '' определение переменных с плавающей точкой


ScreenRes (hor, vert, 24)   '' установка разрешения окна и глубины (число бит) цвета


'' функция получения случайного целого числа в диапозоне 0-255 для одной из компоненты RGB цвета
Function Col As Integer
   Return Int(Rnd*255)
End Function


'' функция получения случайного целого числа в диапазоне от 0 до n
Function Poz(n As Integer) As Integer
   Return Int(Rnd*n)
End Function


'' главный цикл
Do While inkey = ""   '' пока не нажата любая клавиша
   For count = 1 To 1000000 '' повторяем миллион раз
      PSet (Poz(hor), Poz(vert)), RGB(Col, Col, Col)   '' рисуем точку случайным цветом в случайной позиции
   Next
   '' выводим время отрисовки миллиона пикселей в заголовок окна
   WindowTitle "Draw million pixels time: "+Str(Int((Timer-start)*100)/100)+" sec."
   start=Timer      '' присваиваем значение переменной из системного таймера
Loop   '' продолжаем главный цикл сначала


End '' завершение работы




Если есть желание, повтори на C++, LanuHum
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 30 Июль 2016, 23:39:57
вопрос конкретный,конечно, по пока я его рассматриваю как риторический :)
Итак, вернёмся к нашим "тараканам"...если ещё желание у автора темы не пропало ковырять C++
Набросал маленькую программку на FreeBasic:
Если есть желание, повтори на C++, LanuHum
Есть у меня желание, нет, но С++ я ковыряю всё-равно.
Завтра напишу.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 31 Июль 2016, 10:50:11
Цитировать
повтори на C++, LanuHum
Вот часть кода:
Код
#include <iostream>
#include <vector>
#include <random>

using namespace std;

unsigned int hor = 800, vert = 600;  // задаём размер изображения
unsigned long pixels = hor * vert;  // вычисляем число пикселов   
vector<unsigned int [4]> image(pixels); // создаём базу данных для чёрного изображения

int main(void) {
    const int max_value = 255;  // указываем максимальную величину цвета
    unsigned long pixel_number = rand() % pixels;   // выбираем случайный пиксел
    unsigned int r, g, b, a;    // объявляем переменные цветов и альфы
    r = rand() % max_value;     //  случайный красный
    g = rand() % max_value;     //  случайный зелёный
    b = rand() % max_value;     //  случайный синий
    a = rand() % max_value;     //  случайная альфа
    image[pixel_number][0] = r; //  заменяем в случайно выбранном пикселе чёрной картинки красный
    image[pixel_number][1] = g; //  заменяем в случайно выбранном пикселе чёрной картинки зелёный
    image[pixel_number][2] = b; //  заменяем в случайно выбранном пикселе чёрной картинки синий
    image[pixel_number][3] = a; //  заменяем в случайно выбранном пикселе чёрной картинки альфу
    std::cout <<r<<" "<<g<<" "<<b<<" "<<a<< std::endl;  // тестируем работоспособность функции просьбой вывести на экран полученный случайный цвет
    return 0;
}

Меняем main(void) на RenderSimulator()
Теперь нужно отыскать в libfox, которая будет рисовать окно, таймер.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 31 Июль 2016, 12:44:13

Цитировать
Вот часть кода:
Не торопись. Жду целиком, чтобы собрать и протестировать скорость.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 31 Июль 2016, 16:19:32
Не торопись. Жду целиком, чтобы собрать и протестировать скорость.
Да, тут поторопишься, блин!
Вставил код вычисления времени, как советуют. Прога компилится, а нифига не линкуется
main.cpp:(.text+0x4f2): undefined reference to `diff(timespec, timespec)'
-lrt написал, не помогает, нужно ещё -L/usr/lib/x86_64-linux-gnu, а у меня такой хрени нету ни в lib, ни в lib64
Успокаивает, что я не один, вопросов про это до и больше.
А, вообще, это интересно, хорошо, что ты предложил тест, который нам покажет то, что нам нужно увидеть самим, а ни то, что там выкладывают.
Ты соберёшь-то в винде?
На вот предварительный код:
Код
// распространять среди друзей и подруг строго запрещается!
// лицензия!!!

#include "fox-1.6/fx.h"
#include <time.h>
#include <iostream>

using namespace std;


class ImageWindow : public FXMainWindow{
  FXDECLARE(ImageWindow)

protected:
  ImageWindow(){}

private:
    FXCanvas *canvas;
    FXColor bgColor = FXRGB(0, 0, 0);

public:
    enum {
        ID_CANVAS = FXMainWindow::ID_LAST,
    };

    long onPaint(FXObject *, FXSelector, void *);
    long onMouseDown(FXObject *, FXSelector, void *);

public:
  ImageWindow(FXApp* a);
  virtual void create();
  virtual ~ImageWindow();
  };

FXDEFMAP(ImageWindow) ImageWindowMap[] = {
        FXMAPFUNC(SEL_PAINT, ImageWindow::ID_CANVAS, ImageWindow::onPaint),
        FXMAPFUNC(SEL_LEFTBUTTONPRESS,   ImageWindow::ID_CANVAS, ImageWindow::onMouseDown)
};

FXIMPLEMENT(ImageWindow, FXMainWindow, ImageWindowMap, ARRAYNUMBER(ImageWindowMap))

ImageWindow::ImageWindow(FXApp* a):FXMainWindow(a,"FOX Render",NULL,NULL,DECOR_ALL,0,0,850,600,0,0){

        FXHorizontalFrame *container=new FXHorizontalFrame(this,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED);
        container->setBackColor(FXRGB(226,223,222));
        FXHorizontalFrame *chartwell=new FXHorizontalFrame(container,FRAME_SUNKEN|LAYOUT_FILL_X|
                                                                LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT,
                                                                0,0,0,0,10,10,10,10);
        canvas = new FXCanvas(chartwell, this, ID_CANVAS, LAYOUT_FILL_X|LAYOUT_FILL_Y);


}

ImageWindow::~ImageWindow() {

}

void ImageWindow::create() {
    FXMainWindow::create();
    show(PLACEMENT_SCREEN);
}

long ImageWindow::onPaint(FXObject *, FXSelector,void *ptr) {
    FXEvent *ev = (FXEvent *) ptr;
    FXDCWindow dc(canvas, ev);
    dc.setForeground(bgColor);
    dc.fillRectangle(0,0,canvas->getWidth(),canvas->getHeight());

    return 1;
}

timespec diff(timespec start, timespec end);
long ImageWindow::onMouseDown(FXObject *, FXSelector, void *ptr){
//timespec time1, time2;
//int temp;
//clock_gettime(CLOCK_MONOTONIC_RAW , &time1);
//for (int i = 0; i< 242000000; i++)
//temp+=temp;
//clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
//std::cout<<diff(time1,time2).tv_sec<<":"<<diff(time1,time2).tv_nsec<<std::endl;
    long b = 0;
    double sec = 20.0000567;
    FXString name;
    name = FXStringVal(sec);
    this->setTitle(name);

    return b;
}
int main(int argc,char *argv[]){
  FXApp application("FoxTest","FoxTest");
  application.init(argc,argv);
  new ImageWindow(&application);
  application.create();
  return application.run();
  }

Тебе нужно сначала вот сюда:
http://www.fox-toolkit.org/
Я специально выбрал либу доступную для виндовс и линукс.
Компилируем:
g++ -Wall -c test.cpp -std=c++11 -lFOX-1.6
Линкуем:
g++ -Wall -o test test.o -std=c++11 -lFOX-1.6 -lrt
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 31 Июль 2016, 16:36:25
Ну ты и намутил :) Нафига эта fox-1.6/fx.h ???
А стандартная graphics.h разве не подойдёт?
Можешь переписать с комментариями как тут?
http://ci-plus-plus-snachala.ru/?p=67
...а то тож хочу потихоньку начать врубаться ...

Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 31 Июль 2016, 17:07:07
Ну ты и намутил :) Нафига эта fox-1.6/fx.h ???
А стандартная graphics.h разве не подойдёт?
Можешь переписать с комментариями как тут?
http://ci-plus-plus-snachala.ru/?p=67
...а то тож хочу потихоньку начать врубаться ...

Я не знаю, что такое graphics.h
Я знаю, что в линуксе рисуют окна Qt, GTK, WXWidget, XWindow, SDL, FLTK, FOX, GLUT, GLFW...
В противном случае нужно писать с нуля, как написали API Блендер
Другое дело, когда ты создаёшь картинку без гуя, а, просто, открываешь её в каком-нибудь штатном приложении/
Вообще, если тебя интересует время создания изображения после миллиона преобразований, то тест можно сделать с выводом времени в консоль.
Почему я взял лиса? Потому что мне потребуется окно с меню, и как в люксе можно будет там организовать постобработку.
И, из всех тестов по скорости гуёв fox является самым быстрым по перерисовке...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 31 Июль 2016, 19:13:41
... будет разумным сразу разделить код на ту часть, которая отвечает за интерфейсные вещи и часть, которая обеспечивает формирование массива данных и  прописать между ними взаимодействие ...
... то есть мешать все в одну кучу и связывать это с какой-то гуишной библиотекой крайне нежелательно ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 31 Июль 2016, 20:34:50
... будет разумным сразу разделить код на ту часть, которая отвечает за интерфейсные вещи и часть, которая обеспечивает формирование массива данных и  прописать между ними взаимодействие ...
... то есть мешать все в одну кучу и связывать это с какой-то гуишной библиотекой крайне нежелательно ...
Думается, как бы не пойти на поводу у советчиков. В С++  как и в С есть такая фишка, которая называется inline. Хочешь, чтобы было крайне быстро, то функцию вставляешь непосредственно в место её выполнения, а не пишешь либу с функцией, ссылаясь потом на либу. Нужно несколько раз - пишешь одну и ту же функцию несколько раз, именно там, где она требуется.
Вот так и Samovar пишет:
Цитировать
Ну ты и намутил :) Нафига эта fox-1.6/fx.h ???
А стандартная graphics.h разве не подойдёт?
Человек хочет получить реальные результаты тестов по производительности, но при этом хочет взять что-то неопределённое, двоечником на С++ написанное, сравнить с гамбасом, а потом стучать себя в грудь и говорить, что разницы он не увидел: гамбас крут!
Из википедии:
Цитировать
FOX Toolkit — кросс-платформенная библиотека инструментов с открытым исходным кодом (лицензия LGPL) для построения графического интерфейса пользователя.
Один из самых быстрых пакетов, содержит большое число элементов GUI и поддержку OpenGL.
Это к тому, что я хочу наблюдать процесс рендера, смотреть как тайлы один за одним открываются... А, если гуёвина будет тормозить, не успевая за GPU, это неинтересно.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 31 Июль 2016, 20:59:49
Fox - это не просто кнопочки, крутилки, это реальный тулкит. Здесь есть собственный FXThread, собственные типы данных FXString, FXDouble и так далее, собственные преобразования из типа в тип , как вот, например, здесь:
name = FXStringVal(sec);
Здесь мы получаем строковое значение из числа с плавающей запятой. Сделаем мы это стандартно std::string - замучаемся приводить одно к другому.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 31 Июль 2016, 22:24:54
Цитировать
Можешь переписать с комментариями как тут?
Сказать честно, не могу прокомментировать подробно. Неплохая книжонка для понимания кода cpp-za-21-den.pdf (Изучаем С++ за 21 день). Название вызывает смех, но там есть то, что позволит понять, что написано в моём коде.
По идее то, что написано до строчки "FXDEFMAP(ImageWindow) ImageWindowMap[] = {" должно быть отдельным файлом с расширением .h или .hpp, например, test.hpp. Здесь объявляется класс ImageWindow и определяются конструктор, деструктор и переменные этого класса. Переменные общего пользования, переменные доступные только для класса, переменные доступные только здесь. Прописываются прототипы функций. У нас их две: onPaint и onMouseDown.
Со строчки "FXDEFMAP(ImageWindow) ImageWindowMap[] = {" начинается файл test.cpp
Здесь объявляется привязка функций к создаваемому классу и создаётся объект ImageWindow::ImageWindow(FXApp* a):FXMainWindow(a,"FOX Render",NULL,NULL,DECOR_ALL,0,0,850,600,0,0)
Далее на окно вешается фрейм и ещё один для красоты. На второй вешается канваз - это полотно, на котором мы будем рисовать и далее прописываем функции, которые  будут исполняться:
деструктор(ImageWindow::~ImageWindow()) - это то, что необходимо выполнить по завершению: у нас там ничего нет, значит, по умолчанию
ImageWindow::onPaint - функция рисования - это автомат. То, что написано там непрерывно рисуется на канвазе
ImageWindow::onMouseDown - функция, которая срабатывает при нажатии кнопки мышки. Здесь мы должны запустить код теста(не дописан). Нажали мышку - начался отсчёт времени и пошёл процесс переназначения цвета миллион раз согласно цикла(этого ещё нету). По завершению цикла завершается отсчёт времени и изменяется заголовок окна this->setTitle(name);
Сейчас, если ты соберёшь, то просто по клику мышкой изменится заголовок.
В общем, когда я добьюсь работоспособности теста, я прокомментирую сколько смогу полный его код .
Сейчас, то, что находится за //(закомментировано) - это то, что должно работать, но не хочет - это как раз точный счётчик времени прохода цикла.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 31 Июль 2016, 22:27:52

Цитировать
Человек хочет получить реальные результаты тестов по производительности, но при этом хочет взять что-то неопределённое, двоечником на С++ написанное, сравнить с гамбасом, а потом стучать себя в грудь и говорить, что разницы он не увидел: гамбас крут!
;D ;D ;D  рассмешил  ;D ;D ;D
Вот тебе ссылка на  функции graphics.h "двоечника"  http://mycpp.ru/cpp/scpp/cppd_graphics.h.htm
Если не хочешь или не можешь написать эту простенькую прогу на Си, то так и скажи. Тогда лучше сам попробую на неделе, чем тебя буду ждать... Про ту прогу, что ты уже написал: я сейчас не хочу себе мозги забивать всякими посторонними библиотеками и вникать в них, потому что я вообще в Си дуб-девере и пытаюсь начать с простого.

Кстати, оптимизированная версия проги на FreeBasic (скорость увеличена в 2 раза)
Код
''#Include "fbgfx.bi" '' это пока нафиг не нужно
Dim As Integer hor=800, vert=600, count   '' определение натуральных (целых) переменных
Dim As Double start=Timer   '' определение вещественных (с плавающей точкой) переменных
ScreenRes (hor, vert, 24)   '' установка разрешения окна и глубины (число бит) цвета
'' функция получения случайного целого числа в диапазоне от 0 до n
Function Poz(n As Integer) As Integer
   Return Rnd*n
End Function
'' главный цикл
Do While inkey = ""   '' пока не нажата любая клавиша
   For count = 1 To 1000000 '' повторяем миллион раз
      PSet (Poz(hor), Poz(vert)), Rnd*&hFFFFFF   '' рисуем точку случайным цветом в случайной позиции
   Next
   '' выводим время отрисовки миллиона пикселей в заголовок окна
   WindowTitle "Draw million pixels time: "+Str(Int((Timer-start)*100)/100)+" sec."
   start=Timer      '' присваиваем значение переменной из системного таймера
Loop   '' продолжаем главный цикл сначала
End '' завершение работы
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 31 Июль 2016, 23:03:09
Цитировать
Если не хочешь или не можешь написать эту простенькую прогу на Си, то так и скажи.
Я не могу нарисовать окно непосредственно используя видеодрайвер. Доволен? Но, вот твои слова:
Цитировать
Не торопись. Жду целиком, чтобы собрать и протестировать скорость.
Так вот теперь ты мне скажи, ты хочешь протестировать скорость или ты хочешь ткнуть в меня пальцем?
Тема топика: рейтрейсер на GPU, если ты забыл.
Я могу тебе предложить другой тест: пишем код, запускающий экземпляры окон,рисующих картинки из файлов.
Запустим сто экземпляров проги на С++, померяем время, и запустим сто экземпляров проги на бейсике, и тоже замеряем время. А потом запустим по миллиону экземпляров и посмотрим, на скольки экземплярах комп повиснет от проги на С++, а на скольких экземплярах повиснет от проги на бейсике.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 31 Июль 2016, 23:09:42
С чего ты взял, что я хочу ткнуть в тебя пальцем и протестить скорость? Эта прога задумывалась как пример оптимизации кусков кода с помощь системного таймера.Типа профайлера. Да я вполне согласен, что код FreеBasic может уступать коду С++, хотя компилятор  gcc у обоих один и тот же :) Вообще речь не об этом... мне ж тоже интересно врубиться в Си. Ты обещал сегодня набросать прогу на Си аналогичную моей на FreeBasic, вот я и ждал... но не думал, что на это у тебя уйдёт почти целый день и в итоге я получу не то что ожидал, а монстра со сторонней либой...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 31 Июль 2016, 23:30:33
Во-первых, я только в общих чертах увидел про что твой код. Во-вторых, я не говорил, что уже знаю С++, и могу за пять минут исполнить любой фрагмент.
В-третьих, твоё предложение не позволит тебе врубиться в С++. Я не видел ни одного букваря по С++, где учат работать с драйверами. Возьми букварь от создателя языка С++ Страуструпа последнее издание и найди там урок по рисованию окна драйвером. По твоей логике - это должен был быть первый урок.
Я ничего не имею против бейсика, но я знаю, что мне его не потянуть. Если я сегодня весь день проискал, почему не линкуется прога на С++, то я пять лет буду искать, как на бейсике выделить вершину куба в окне OpenGL.
Тебе нужно было ни код писать, а просто словами объяснить цель. Я бы это сказал так: Закрась миллион пикселов монитора драйвером и померяй время.
8 слов и всё ясно.
А, то, что я сделал сегодня, мне пригодится для рейтрейсера на GPU, хотя тебе это и не понравилось.

Цитировать
С чего ты взял, что я хочу  протестить скорость?
чтобы собрать и протестировать скорость.
В. Высоцкий:
Цитировать
А мне чё, да ни чё, осталось только материться
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 31 Июль 2016, 23:36:06
Ладно. Понял тебя. Давай только без обоюдных обид. Думал,что синтаксис FreeBasic очень близок к базовому английскому, потому и подумал, что тебе будет просто врубиться в его код, пару раз заглянув в справку, ссылку на которую я давал в теме по Freebasic. То что ты согласился, должно было меня насторожить...
В общем, попробую сам написать на Си и протестировать скорость. Если скорость окажется той же, то забью на Си до поры до времени Один хрен для меня ООП - темный лес на чужой планете, а процедурное программирование вполне себе шустрый машинный код выдает и с помощью FreeBasic+Assembler... хотя, может меня приколет Си... надо пробовать :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 31 Июль 2016, 23:40:56
Цитировать
В общем, попробую сам написать на Си.
Сказать честно, поняв твою цель, у меня и нет желания портировать её. Это лишние знания. Завтра я буду учиться ЧПУ, а послезавтра буду искать, почему я время не могу померять в этой грёбаной проге. :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 01 Август 2016, 00:13:55
Оставлю это здесь.
http://ru.stackoverflow.com/questions/440326/Как-измерить-скорость-работы-программы
Более чем уверен, что это пригодится, если хочется замутить рендерер х50 раз шустрее Суслика :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 01 Август 2016, 18:13:52
LanuHum, ты оказался прав на счёт graphics.h Мои извинения, если я тебя задел вчера. Оказалось, что библиотека шла с Bolrand C++ и в стандарт не входит. Но её изучают в ВУЗ почему-то :) Мне с трудом удалось найти способ подключить её под Code::Blocks http://forinformatics.blogspot.ru/2014/04/code-blocks.html на английском http://www.codewithc.com/how-to-include-graphics-h-in-codeblocks/
Вот чего пишут про Linux (англ.) https://mandeepsimak.wordpress.com/2012/02/29/graphics-h-in-linux-for-cc/
Кстати нарисовал миллион пикселей на С++ с помощью этого... даже таймер не пришлось подключать. Очень медленно, потому что без аппаратного ускорения, видимо...



А чем тебя SDL не устраивает?
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 01 Август 2016, 18:22:45
Если интересно, то вот простейший рендерер на фотонах (Freebasic): http://www.freebasic.net/forum/viewtopic.php?f=7&t=15154
Видео автора https://www.youtube.com/playlist?list=PL1EE5A9A3594BFDCF
В теме несколько вариантов, этот последний:

Код

' PhotonMapping


#ifndef true
#define true -1
#define false 0
  #endif


Type float As single 'double


Const As Integer xDimension          = 512
Const As Integer yDimension          = 512
Const As Integer nTypes              = 2 ' two types of objects sphere and plane
Const As Integer MaxPhotons          = 200
Const As Integer MaxPhotonRefections = 1
Const As float  PhotonSize           = 0.1
Const As float gInverseSquared       = 1.0 / PhotonSize * PhotonSize
Const As float  MilliSeconds         = 500
Const As float gExposure             = 1.0 / (1000 / MilliSeconds)
Const As Integer MaxRaytraceRefections = 12


#define nSpheres 3 ' number of spheres
#define nPlanes  6 ' number of planes (a box)
Dim Shared As float Ratio
Dim Shared As Integer gNObjects(1) = {nSpheres,nPlanes&}
Dim Shared As float  gAmbient      = 0
Dim Shared As float  gOrigin(2)
Dim Shared As float  gLight(2)     = {0,1.0,4} 'x,y,z position


Dim Shared As float  gSpheres(nSpheres-1,3) =  {_
                            {-1.0,-1.0,4.0, 0.5} , _
                            { 6.4, 0.0,2.8, 5.0} , _
                            { 1.0,-1.0,4.0, 0.5}}
                             ' x,y,z, position and radius


Dim Shared As float  gPlanes(nPlanes-1,1)  = {_
                                      {0,  1.5}, _
                                      {0, -1.5}, _
                                      {1, -1.5}, _
                                      {1,  1.5}, _
                                      {2,  5.0}, _
                                      {2, -1.0}}


Dim Shared As Integer NumberOfPhotons(1,5)
Dim Shared As float   gPhotons(nTypes,nPlanes+nSpheres, _
                               MaxPhotons + MaxPhotons*MaxPhotonRefections, _
                               2,2) '3 * x,y,z
Dim Shared As Integer gIntersect
Dim Shared As Integer gType
Dim Shared As Integer gIndex
Dim Shared As float   gDist2,gDist
Dim Shared As float   gPoint(2)


Function min(a As float ,b As float ) As float
  If b<a Then Return b
  Return a
End Function


Function max(a As float ,b As float ) As float
  If b>a Then Return b
  Return a
End Function


Function rnd2 As float
  Return (Rnd-Rnd)
End Function


Function SquaredDistance(a() As float , _
                         b() As float , _
                         d2 As float ) As Integer
  Dim As float  ab = a(0) - b(0)
  Dim As float  d = ab*ab
  If (d > d2) Then Return false
  ab = a(1) - b(1)
  d += ab*ab
  If (d > d2) Then Return false
  ab = a(2) - b(2)
  d += ab*ab
  If (d > d2) Then Return false
  gDist2 = d
  Return true
End Function


Sub SurfaceNormal(r() As float , _
                  typ As Integer, _
                  idx As Integer, _
                  HitPoint() As float , _
                  O() As float )
  Dim As float  Normal(2),L
  If (typ = 0) Then
    Normal(0)=HitPoint(0)-gSpheres(idx,0)
    Normal(1)=HitPoint(1)-gSpheres(idx,1)
    Normal(2)=HitPoint(2)-gSpheres(idx,2)
  Elseif (typ = 1) Then
    Dim As Integer axis = gPlanes(idx,0)
    Normal(axis) = O(axis) - gPlanes(idx,1)
  Else
    'beep
  End If
  l=Normal(0)*Normal(0) _
   +Normal(1)*Normal(1) _
   +Normal(2)*Normal(2)
  If l Then l=1/Sqr(l)
  r(0)=Normal(0)*l
  r(1)=Normal(1)*l
  r(2)=Normal(2)*l
End Sub


Sub Mirror2(Ret()       As float, _
            Direction() As float, _
            HitPoint()  As float, _
            Normale()   As float)
  Dim As float L
  HitPoint(0)+=Direction(0)*-0.1
  HitPoint(1)+=Direction(1)*-0.1
  HitPoint(2)+=Direction(2)*-0.1
  L = Normale(0)*Direction(0) _
    + Normale(1)*Direction(1) _
    + Normale(2)*Direction(2)
  L*=-2
  Ret(0)=Direction(0)+L*Normale(0)
  Ret(1)=Direction(1)+L*Normale(1)
  Ret(2)=Direction(2)+L*Normale(2)
End Sub


Sub MirrorVec(Ret()       As float ,_
              Direction() As float , _
              Origin()    As float )
  Dim As float  L,Normale(2)
  SurfaceNormal(Normale(),gType, gIndex, gPoint(), Origin())
  gPoint(0)+=Direction(0)*-0.1
  gPoint(1)+=Direction(1)*-0.1
  gPoint(2)+=Direction(2)*-0.1
  L = Normale(0)*Direction(0) _
    + Normale(1)*Direction(1) _
    + Normale(2)*Direction(2)
  L*=-2
  Ret(0)=Direction(0)+L*Normale(0)
  Ret(1)=Direction(1)+L*Normale(1)
  Ret(2)=Direction(2)+L*Normale(2)


End Sub


'
' Raytracing
'
Sub Raytrace(RayDirection() As float ,RayOrigin() As float )
  gIntersect = false
  gDist      = 999999.9
 
  If gNObjects(1)>0 Then
    For idx As Integer =0 To gNObjects(1)-1
      Dim As Integer axis = gPlanes(idx,0)
      If RayDirection(axis)<>0 Then
        Dim As float  l = (gPlanes(idx,1) - RayOrigin(axis)) / RayDirection(axis)
        If (l>0) And (l<gDist) Then
          gType  = 1
          gIndex = idx
          gDist  = l
          gIntersect = true
        End If
      End If
    Next
  End If
 
  If gNObjects(0)>0 Then
    Dim As float  SphereDirection(2)
    Dim As float  A = RayDirection(0)*RayDirection(0) _
                    + RayDirection(1)*RayDirection(1) _
                    + RayDirection(2)*RayDirection(2)
                  A+=A
    For idx As Integer =0 To gNObjects(0)-1
      SphereDirection(0)=RayOrigin(0)-gSpheres(idx,0)
      SphereDirection(1)=RayOrigin(1)-gSpheres(idx,1)
      SphereDirection(2)=RayOrigin(2)-gSpheres(idx,2)
      Dim As float  R = gSpheres(idx,3)*gSpheres(idx,3)
      Dim As float  B = SphereDirection(0)*RayDirection(0) _
                      + SphereDirection(1)*RayDirection(1) _
                      + SphereDirection(2)*RayDirection(2)
                    B+=B
                   
      Dim As float  C = SphereDirection(0)*SphereDirection(0) _
                      + SphereDirection(1)*SphereDirection(1) _
                      + SphereDirection(2)*SphereDirection(2)
                    C-=R
      Dim As float  D = B*B - 2*A*C
      If (D>0.0) Then
        Dim As float  sign  = iif(C < -0.0001,1.0,-1.0)
        Dim As float  l = (-B + sign*Sqr(D))/A
        If (l>0.0) And (l<gDist) Then
          gType      = 0
          gIndex     = idx
          gDist      = l
          gIntersect = true
        End If
      End If
    Next
  End If
End Sub


Sub AbsorbColor(ret()   As float , _
                rgbIn() As float , _
                r As float ,g As float ,b As float )
  Dim As float  rgbOut(2)={r,g,b}
  For c As Integer =0 To 2
    If rgbOut(c)<rgbIn(c) Then
      ret(c)=rgbOut(c)
    Else
      ret(c)=rgbIn(c)
    End If
  Next
End Sub


Sub GetColor(r() As float , _
            rgbIn() As float , _
            typ As Integer, _
            idx As Integer)


  If (typ=0) Then     ' spheres
    If idx=0 Then
      AbsorbColor(r(),rgbIn(), 0.0,0.0,0.0)
    Elseif idx=1 Then
      AbsorbColor(r(),rgbIn(), 0.0,0.0,0.0)
    elseif idx=2 then
      AbsorbColor(r(),rgbIn(), 0.2,0.2,0.
    End If
  Elseif (typ=1) Then ' planes
    If idx=0 Then
      AbsorbColor(r(),rgbIn(), 0.1, 0.8, 0.1) ' right
    Elseif idx=1 Then
      AbsorbColor(r(),rgbIn(), 0.8, 0.1, 0.1) ' left
    Elseif idx=2 Then
      AbsorbColor(r(),rgbIn(), 0.5, 0.5, 0.0) ' floor
    Elseif idx=3 Then
      AbsorbColor(r(),rgbIn(), 0.2, 0.2, 0.2) ' ceil
    Elseif idx=4 Then
      AbsorbColor(r(),rgbIn(), 0.0, 0.0, 0.0) ' front
    Elseif idx=5 Then
      AbsorbColor(r(),rgbIn(), 0.0, 0.0, 0.0) ' behind camera
    End If
  End If
End Sub


'
' Photon Mapping
'
Sub GatherPhotons(energy() As float , _
                  HitPoint() As float , _
                  typ As Integer, _
                  idx As Integer)
  Dim As float  N(2)
  Dim As float  v(2)
  Dim As float  weight
  Dim As float  frgb(2)
  SurfaceNormal(N(), typ, idx, HitPoint(), gOrigin())


  For i As Integer = 0  To  NumberOfPhotons(typ,idx)-1
    ' photon location
    v(0)=gPhotons(typ,idx,i,0,0)
    v(1)=gPhotons(typ,idx,i,0,1)
    v(2)=gPhotons(typ,idx,i,0,2)
    ' in the near of an active photon ?
    If (SquaredDistance(HitPoint(),v(),gInverseSquared)) Then
      ' photon direction
      Dim As float  cosin = N(0)*gPhotons(typ,idx,i,1,0) _
                          + N(1)*gPhotons(typ,idx,i,1,1) _
                          + N(2)*gPhotons(typ,idx,i,1,2)
      weight = max(0.0, -cosin)
      if weight then
        weight *= (1.0 - sqr(gDist2)) * gExposure
        if weight then
          ' photon energy
          frgb(0)+=gPhotons(typ,idx,i,2,0)*weight
          frgb(1)+=gPhotons(typ,idx,i,2,1)*weight
          frgb(2)+=gPhotons(typ,idx,i,2,2)*weight
        end if
      end if
    End If
  Next
  For j As Integer=0 To 2
    energy(j)=max(0,min(1,frgb(j) ) )
  Next
End Sub


Sub StorePhoton(typ As Integer, _
                idx As Integer, _
                l() As float ,_
                d() As float , _
                e() As float )
  Dim As Integer Photon=NumberOfPhotons(typ,idx)
 
  For i As Integer=0 To 2
    gPhotons(typ,idx,Photon,0,i) = l(i) ' Location
    gPhotons(typ,idx,Photon,1,i) = d(i) ' Direction
    gPhotons(typ,idx,Photon,2,i) = e(i) ' Energy
  Next
  NumberOfPhotons(typ,idx)=Photon+1
End Sub


Sub ShadowPhoton(RayDirection() As float )
  static As float  BumpedPoint(2)
  static As float  ShadowPoint(2)
  Static As float ShadowEnerg(2) = {-0.2,-0.2,-0.2}
  Dim As float   OldPoint(2) = {gPoint(0), gPoint(1),gPoint(2)}
  Dim As Integer OldType     = gType
  Dim As Integer OldIndex    = gIndex
  Dim As float   OldDist     = gDist
 
  BumpedPoint(0)=gPoint(0)+RayDirection(0)*0.000001
  BumpedPoint(1)=gPoint(1)+RayDirection(1)*0.000001
  BumpedPoint(2)=gPoint(2)+RayDirection(2)*0.000001


  Raytrace(RayDirection(), BumpedPoint())


  ShadowPoint(0)=BumpedPoint(0)+RayDirection(0)*gDist
  ShadowPoint(1)=BumpedPoint(1)+RayDirection(1)*gDist
  ShadowPoint(2)=BumpedPoint(2)+RayDirection(2)*gDist


  StorePhoton(gType, gIndex, ShadowPoint(), RayDirection(), ShadowEnerg())


  gPoint(0) = OldPoint(0)
  gPoint(1) = OldPoint(1)
  gPoint(2) = OldPoint(2)
  gType     = OldType
  gIndex    = OldIndex
  gDist     = OldDist


End Sub


Sub EmitPhotons
  randomize 1 'timer
  dim As float PhotonEnergy(2)
  dim As float PhotonDirection(2)
  dim As float PhotonOrigin(2),l
  For typ As Integer = 0 To nTypes-1
    For idx As Integer = 0 To gNObjects(typ)-1
      NumberOfPhotons(typ,idx) = 0
    Next
  Next
  For i As Integer = 0 To MaxPhotons-1
    Dim As Integer Reflection = 0
    ' random photon Energy
    PhotonEnergy(0)=rnd
    PhotonEnergy(1)=rnd
    PhotonEnergy(2)=rnd
#if 0
    ' normalize energy
    l = PhotonEnergy(0)*PhotonEnergy(0) _
      + PhotonEnergy(1)*PhotonEnergy(1) _
      + PhotonEnergy(2)*PhotonEnergy(2)
    if l then
      l=1.0/sqr(l)
      PhotonEnergy(0)*=l
      PhotonEnergy(1)*=l
      PhotonEnergy(2)*=l
    end if
#endif


    ' radom photon Direction
    PhotonDirection(0)= rnd2
    PhotonDirection(1)= rnd2*2
    PhotonDirection(2)= rnd2
#if 0
    ' normalize direction
    l = PhotonDirection(0)*PhotonDirection(0) _
      + PhotonDirection(1)*PhotonDirection(1) _
      + PhotonDirection(2)*PhotonDirection(2)
    if l then
      l=1.0/sqr(l)
      PhotonDirection(0)*=l
      PhotonDirection(1)*=l
      PhotonDirection(2)*=l
    end if
#endif


    ' photon position origin from light
    PhotonOrigin(0)=gLight(0)
    PhotonOrigin(1)=gLight(1)
    PhotonOrigin(2)=gLight(2)


    Raytrace(PhotonDirection(), PhotonOrigin())
    While (gIntersect<>0) And (Reflection < MaxPhotonRefections)
      Reflection+=1
      gPoint(0)=PhotonOrigin(0)+PhotonDirection(0)*gDist
      gPoint(1)=PhotonOrigin(1)+PhotonDirection(1)*gDist
      gPoint(2)=PhotonOrigin(2)+PhotonDirection(2)*gDist
      GetColor(PhotonEnergy(),PhotonEnergy(),gType,gIndex)
#if 0
      Dim As float l=1.0/Reflection
      PhotonEnergy(0)*=l
      PhotonEnergy(1)*=l
      PhotonEnergy(2)*=l
#endif
      StorePhoton(gType, gIndex, gPoint(), PhotonDirection(),PhotonEnergy())
      ShadowPhoton(PhotonDirection())
      MirrorVec(PhotonDirection(),PhotonDirection(),PhotonOrigin())
      Raytrace(PhotonDirection(), gPoint())
      PhotonOrigin(0)=gPoint(0)
      PhotonOrigin(1)=gPoint(1)
      PhotonOrigin(2)=gPoint(2)
    Wend
  Next
End Sub


Sub GetPixelColor(PixelRGB() As float , _
                  x As float ,y As float , z As float=1)
  Dim As float  RayDirection(2) = {x,y,z}
  Raytrace(RayDirection(), gOrigin())
  If (gIntersect) Then
    gPoint(0)=gOrigin(0)+RayDirection(0)*gDist
    gPoint(1)=gOrigin(1)+RayDirection(1)*gDist
    gPoint(2)=gOrigin(2)+RayDirection(2)*gDist
    GatherPhotons(PixelRGB(),gPoint(),gType,gIndex)
   ' If gType=0 or gIndex>3 Then
    Dim As Integer nDivs=0,nReflection=0
    Dim As float  MirrorsRGB(2)
    While ((gType=0 And gIndex<2) Or gIndex>3) And gIntersect And _
          (nReflection<MaxRaytraceRefections)
      nReflection+=1
      MirrorVec(RayDirection(),RayDirection(),gOrigin())
      Raytrace(RayDirection(), gPoint())
      If (gIntersect) Then
        Dim As float  MirRGB(2)
        nDivs+=1
        gPoint(0)+=RayDirection(0)*gDist
        gPoint(1)+=RayDirection(1)*gDist
        gPoint(2)+=RayDirection(2)*gDist
        GatherPhotons(MirRGB(),gPoint(),gType,gIndex)
        MirrorsRGB(0)+=MirRGB(0)
        MirrorsRGB(1)+=MirRGB(1)
        MirrorsRGB(2)+=MirRGB(2)
      End If
    Wend
    If nDivs>0 Then
      MirrorsRGB(0)/=nDivs
      MirrorsRGB(1)/=nDivs
      MirrorsRGB(2)/=nDivs
      PixelRGB(0)=PixelRGB(0)*0.25+MirrorsRGB(0)*0.75
      PixelRGB(1)=PixelRGB(1)*0.25+MirrorsRGB(1)*0.75
      PixelRGB(2)=PixelRGB(2)*0.25+MirrorsRGB(2)*0.75
    End If
   
    'End If
  Else
    PixelRGB(0)=1 ' !!! debug only !!!
    PixelRGB(1)=0
    PixelRGB(2)=1
  End If
End Sub




Sub Render
  Dim As Integer h,m,s,l,t
  dim as float b(2),x,y
  Dim As Double t1=Timer
  WindowTitle " PhotonMapper rendering ..."
  for t =0 to yDimension-1
    Y = -(t/yDimension - 0.5)
    screenlock
    for l =0 to xDimension-1
      X =  (l/xDimension - 0.5)*Ratio
      GetPixelColor(b(),x,y)
      pset (l,t),rgb(b(0)*255,b(1)*255,b(2)*255)
    next
    screenunlock
  next
  s=timer-t1:h=s\3600:s-=h*3600:m=s\60:s-=m*60
  WindowTitle "PhotonMapper done " & h & ":" & m & ":" & s
End Sub


'
' main
'
Ratio= iif(xDimension>yDimension, _
           xDimension/yDimension, _
           yDimension/xDimension)


Randomize Timer
ScreenRes xDimension,yDimension,24
EmitPhotons
Render
'Bsave "PhotonMapper.bmp",0
Sleep
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 01 Август 2016, 20:45:34

То что у меня вышло на Си :) Тяжеловато врубаться...
Код
#include <graphics.h>
#include <stdio.h>


int main( void)
{
    //---------- Инициализация графики ----------//
    int gdriver = DETECT, gmode, errorcode;
    initgraph(&gdriver,&gmode,"");
    //---------- Конец инициализации -----------//


    for (int i = 0; i < 1000000; i++)
    {
        putpixel(rand()%640,rand()%500,rand()%0xFFFF);
    }


    printf("End");


return 0;
}
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 01 Август 2016, 23:04:23
Да я вполне согласен, что код FreеBasic может уступать коду С++, хотя компилятор  gcc у обоих один и тот же :) Вообще речь не об этом... мне ж тоже интересно врубиться в Си.
Я не вижу, что у freebasic  в линуксе компилятор gcc. Отдельный пакет с бинарником fbc Для компиляции он и зызывается. В gcc для компиляции С++ кода используются оптимизации, которые ускоряют процесс, но по умолчанию отключены. Оптимизируется код freebasic или нет, я не знаю.

Не думаю, что ты начал с простого. Вернее, может, и с простого, но закончится это ещё одной сторонней либой по рисованию окон. Одно дело пиксели покрасить, а другое дело, файловый диалог вызвать, чтобы выбрать файл для рендера, и пошло поехало...

SDL - либа слабая. Я не видел ни скроллеров в ней, ни сплиттеров. Её используют многие для вывода картинки рендера, но, у меня виды на будущее.
Я выбрал либу с большИм числом виджетов. В прок! :) Чтоб не переписывать потом, и не изобретать велосипед в поисках чего-то типа graphics.h. К фоксу я нашёл либу, использующую векторную графику Cairo, с помощью которой можно крутилки красивые нарисовать, как это делает GTK.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 01 Август 2016, 23:45:44
Цитировать
Я не вижу, что у freebasic  в линуксе компилятор gcc
Вообще используется https://ru.wikipedia.org/wiki/GNU_Binutils

Внешние библиотеки (есть и Cairo)
http://free-basic.ru/helprus/ExtLibTOC.html

Полная русская справка тут: http://free-basic.ru/helprus/DocToc.html

Freebasic не умеет автоматом оптимизировать код... увы, это придётся делать вручную... Пишут, что медленней, именно поэтому...

Цитировать
Не думаю, что ты начал с простого. Вернее, может, и с простого, но закончится это ещё одной сторонней либой по рисованию окон. Одно дело пиксели покрасить, а другое дело, файловый диалог вызвать, чтобы выбрать файл для рендера, и пошло поехало...
Да графический интерфейс можно любой навестить, как сделано в  Pov-ray под Win... дело же не в нём, а в самом рендерере :)

Пиши на Cи, не вопрос... Freebasic просто проще... Может кому-то эта инфа по Freebasic пригодится, для своих маленьких прог, генераторов и утилит.

Завтра, если время будет, попробую "лиса" прикрутить к Code::Blocks и твой пример глянуть...

Кстати, в том примере с  пикселями у меня используется DirectX, потому так шустро... у тебя по идее это должен быть X11
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: sungreen от 02 Август 2016, 06:15:38
>> Кстати, в том примере с  пикселями у меня используется DirectX, потому так шустро... у тебя по идее это должен быть X11
... наверное даже не x11, а opengl ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 02 Август 2016, 08:14:17
>> Кстати, в том примере с  пикселями у меня используется DirectX, потому так шустро... у тебя по идее это должен быть X11
... наверное даже не x11, а opengl ...
хрен его знает  :) ... хотя, да, прочёл невнимательно...в справке так и написано: http://free-basic.ru/helprus/GfxLib.html

Вот "пиксели" Freebasic на OpenGL (ещё в 2 раза шустрее почему-то):
Код
' Интеграция OpenGL
#INCLUDE Once "GL/gl.bi"
'#INCLUDE Once "GL/glu.bi"

' Определение констант, которые важны для экрана
Const scrnX = 800
Const scrnY = 600
Const depth = 32
Const fullscreen = &h0           ' Полноэкранный режим ( &h0 = обычный, &h1 = полноэкранный )
Dim As String driver: Dim As Integer i: Dim As Double start
Screenres scrnX,scrnY,depth,,&h2 Or fullscreen '&h2 = режим OpenGL
ScreenInfo ,,,,,, driver
' Конфигурация OpenGL
glMatrixMode(GL_PROJECTION)      ' Определение матрицы
glLoadIdentity
glViewport(0,0,scrnX,scrnY)      ' Установка оси координат
glOrtho(0,scrnX,scrnY,0,-128,128)
glMatrixMode(GL_MODELVIEW)       ' Отключить вывод невидимых частей
glEnable(GL_CULL_FACE)
glCullFace(GL_BACK)
'glEnable GL_TEXTURE_2D           ' Включение текстур
'glLoadIdentity
'glEnable(GL_DEPTH_TEST)          ' Тест глубины
'glDepthFunc(GL_LESS)
'glEnable(GL_ALPHA_TEST)          ' Тест Альфа
'glAlphaFunc(GL_GREATER, 0.1)

Do
   glClear  GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT 'очищаем экран
   '  !! здесь различные команды !!
   start = Timer
   'glPointSize (rnd*10) 'размер точки
   glBegin (GL_POINTS)
      For i = 1 To 1000000   
         glColor3f (Rnd,Rnd,Rnd) ' RGB цвет в формате 0 до 1
         glVertex2f (Rnd*scrnX, Rnd*scrnY) ' рисуем точку
      Next i
   glEnd
   WindowTitle "Driver: "+driver+"  Time: "+Str(Timer-start)
   '  !! здесь различные команды !!
   glFlush ' Обработка команд
   Flip
Loop Until MultiKey(&h01) ' Выход из цикла при нажатии Esc
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 02 Август 2016, 11:14:14
Цитировать
SDL - либа слабая. Я не видел ни скроллеров в ней, ни сплиттеров. Её используют многие для вывода картинки рендера, но, у меня виды на будущее.
Я выбрал либу с большИм числом виджетов. В прок! :) Чтоб не переписывать потом, и не изобретать велосипед в поисках чего-то типа graphics.h. К фоксу я нашёл либу, использующую векторную графику Cairo, с помощью которой можно крутилки красивые нарисовать, как это делает GTK.
Ланухумыч, ты сильно только не обижайся  :), но я тебе ещё раз напомню про твою задумку с GUI. Пока даже непонятна суть рендерера, который ты планируешь. На сей раз с помощью видео: https://www.youtube.com/watch?v=OvAHirMoUWk
Увы, выглядит это именно так... надеюсь, начинка сначала будет написана, а до нее план, как советовали раньше :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 02 Август 2016, 18:04:51
Samovar, ты мне объясни, почему для теста ты выбрал перерисовку пикселов?
Почему ты не взял просто какое-нибудь математическое действие, выполняемое миллион раз?
Дело в том, что я своей бестолковкой сразу связал перерисовку пикселов  с процессом, который рано или поздно востребуется в рендере.
Я не знаю, почему некоторые делают вывод изображения в опенгл или директ-икс , а не простой просмотрщик изображений. Какие-то инициализации, 2Д текстуры. Если это задействует видеокарту, то на мой взгляд, это плохо. Карта нам будет нужна для вычислений рэйтрэйсинга, и нагружать её выполнением вспомогательных функций, кажется нецелесообразным.
Теперь про саму задумку. То бишь, чего хочется-то? В противоположность тенденции писать unbias - физически точное, мне хочется написать bias - физически приблизительное с двумя решающими критериями:
1. скорость максимальная
2. потребление ресурсов минимальное.
Я уже ни раз упоминал Art Of Illusion. Вот там максимальная скорость, то бишь удовлетворяется первое требование. Второе требование прога не выполняет, вообще. Она не в состоянии разумно распоряжаться оперативной памятью компьютера. Povray умеет очень хорошо распоряжаться памятью компьютера, зато у него нет той скорости, которой обладает Art Of Illusion.
Посему поэтому сначала необходимо безо всяких планов на будущее тупо разобраться с алгоритмами рэйтрэйсинга и понять: как достигается скорость и как достигается экономичность на практике.
Почему я выбрал С++?
1. Всегда можно найти место на просторах сети, где подскажут конкретно по существу проблемы, потому что достаточное количество литературы и примеров.
2. Указатели и ссылки - это реально круто. Манипуляция данными происходит по адресам этих данных в оперативке. В этом зарыта скорость выполнения.
3. ООП разгружает мозг, раскладывая всё по полочкам. Я поверил на слово Страуструпу, когда прочитал в книге его рекомендации почему не стоит использовать С там, где это совсем не требуется, почему не стоит на С++ писать как на С, используя структуры, отказываясь от классов и тому подобное...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 02 Август 2016, 21:25:08
Цитировать
Samovar, ты мне объясни, почему для теста ты выбрал перерисовку пикселов?
Почему ты не взял просто какое-нибудь математическое действие, выполняемое миллион раз?
Дело в том, что я своей бестолковкой сразу связал перерисовку пикселов  с процессом, который рано или поздно востребуется в рендере.
sungreen навёл на мысль, но согласен можно было протестировать математику на проце без сопроцессора, на проце с использованием сопроцессора... это просто для наглядности, хотя в итоге, ради расчёта цвета конкретного пикселя весь процесс рендеринга и затевается... но писать его, естественно, надо в какой-то иной кусок памяти, а затем иногда выводить этот кусок памяти или его фрагмент  в видеобуфер для просмотра, чего там делается - быстрее всего это будет, вероятно, с помощью OpenGL.
В том же Lux, если не ошибаюсь, этот процесс можно регулировать крутилкой, задавая время обновления картинки.




Цитировать
Посему поэтому сначала необходимо безо всяких планов на будущее тупо разобраться с алгоритмами рэйтрэйсинга и понять: как достигается скорость и как достигается экономичность на практике.
Но вообще, хотелось бы, что бы ты уж что-то начал. Так даже будет проще врубиться.
1. создал бы камеру и описал её положение, направление и прочие свойства типа перспективы и т.п. а так же привязал её к размеру визуализируемого изображения.
2. создал простейший объект типа треугольника в пространстве, описав координаты его вершин и нормаль
3. запустил сканирующий луч из камеры, и проверял бы его на пересечение с этим треугольником, рисуя чёрные точки, если луч не пересекается с треугольником и белые, когда пересекается. Но перед этим проверил бы, находится ли треугольник в поле видимости камеры (в пирамиде камеры). Если нет, то незачем проверять его на пересечение с лучом.
Это будет простейший Camera Ray или Первичный луч и в итоге должно получится изображение альфа канала без сглаживания... а дальше начнёшь потихоньку усложнять, прикрутив, возможно, сглаживание...учитывая расстояние, которое прошёл луч до пересечения, получишь Z-буфер... и так, потихоньку, помаленьку начнёт приходить понимание, как эти процессы можно оптимизировать...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 03 Август 2016, 01:44:40
По пункту 1: http://gamesmaker.ru/programming/directx/virtualnaya-kamera-perspektivnaya-proekciya/ 2 части + исходники
ещё инфы тут в самом начале http://www.enlight.ru/faq3d/articles/11.htm

По пункту 2: можешь экспортировать объект из Блендера в формат .raw (это список ХYZ вершин треугольников по порядку) и написать простенькую функцию его чтения в массив.

По пункту 3: пока не нашел примеров пересечения, может кто-то подскажет ссылки на то, как найти пересечение луча с плоскостью? По проверке на видимость в пирамиде камеры есть тут: http://pmg.org.ru/nehe/nehex2.htm
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 03 Август 2016, 02:11:47
Мимоходом нарвался на скрипт для blender 2.4х, который экспортирует в OpenGL Си... нихрена пока не разобрался как он должен работать... Есть ли подобный для текущих версий Блендера?


Скрипт:

Код
#!BPY

"""
Name: 'Objective-C Header (.h)'
Blender: 244
Group: 'Export'
Tooltip: 'Exports .h file for use with OpenGL ES - Modified by Jody McAdams (jmcadams@digipen.edu).  Original from iphonedevelopment.blogspot.com'
"""
import Blender
from Blender import *
import bpy
import bpy
import os

       
def write_obj(filepath):   
    out = file(filepath, 'w')
    sce = bpy.data.scenes.active
    ob = sce.objects.active
    mesh = Mesh.New()       
    mesh.getFromObject(ob.name)

    editmode = Window.EditMode()
    if editmode: Window.EditMode(0)
    has_quads = False
    for f in mesh.faces:
        if len(f) == 4:
            has_quads = True
            break
   
    if has_quads:
        oldmode = Mesh.Mode()
        Mesh.Mode(Mesh.SelectModes['FACE'])
       
        mesh.sel = True
        tempob = sce.objects.new(mesh)
        mesh.quadToTriangle(0) # more=0 shortest length
        oldmode = Mesh.Mode(oldmode)
        sce.objects.unlink(tempob)
       
        Mesh.Mode(oldmode)
   
    objectname = ob.getData(True)
    basename = objectname.capitalize()

    out.write('#import "GraphicsTypes.h"\n\n\n')
       
    if (mesh.faceUV):
        out.write('static const TexturedVertexData3D %sVertexData[] = {\n' % basename)
        for face in mesh.faces:
            for (vert, uvert) in zip(face.verts, face.uv):
                out.write('\t{/*v:*/{%f, %f, %f}, ' % (vert.co.x, vert.co.z, -vert.co.y) )
                out.write('/*n:*/{%f, %f, %f}, ' % (vert.no.x, vert.no.z, -vert.no.y))
                out.write('/*t:*/{%f, %f}' % ( uvert.x, 1.0-uvert.y ) )
                out.write('},\n')
        out.write('};\n\n')
    elif (mesh.vertexColors):
        out.write('static const ColoredVertexData3D %sVertexData[] = {\n' % basename)
        for face in mesh.faces:
            for (vert, color) in zip(face.verts, face.col):
                out.write('\t{/*v:*/{%f, %f, %f}, ' % (vert.co.x, vert.co.z, -vert.co.y) )
                out.write('/*n:*/{%f, %f, %f}, ' % (vert.no.x, vert.no.z, -vert.no.y))
                out.write('/*c:*/{%f, %f, %f, %f}' % ( color.r / 255.0, color.g / 255.0, color.b / 255.0, color.a / 255.0) )
                out.write('},\n')
        out.write('};\n\n')
    else:
        out.write
        out.write('static const VertexData3D %sVertexData[] = {\n' % basename)
        for face in mesh.faces:
            for vert in face.verts:
                out.write('\t{/*v:*/{%f, %f, %f}, ' % (vert.co.x, vert.co.z, -vert.co.y) )
                out.write('/*n:*/{%f, %f, %f} ' % (vert.no.x, vert.no.z, -vert.no.y))
                out.write('},\n')
        out.write('};\n\n')
   
    if editmode: Window.EditMode(1)
    out.write('#define k%sNumberOfVertices\t%i\n' % (basename, len(mesh.faces) * 3) )

    out.write('// Drawing Code:\n')
    out.write('// glEnableClientState(GL_VERTEX_ARRAY);\n')
    if (mesh.faceUV):
        out.write('// glEnableClientState(GL_TEXTURE_COORD_ARRAY);\n')
    elif (mesh.vertexColors):
        out.write('// glEnableClientState(GL_COLOR_ARRAY);\n')
        out.write('// glEnable(GL_COLOR_MATERIAL)\n')
    out.write('// glEnableClientState(GL_NORMAL_ARRAY);\n')
    out.write('// glVertexPointer(3, GL_FLOAT, sizeof(')
    if (mesh.faceUV):
        out.write('TexturedVertexData3D')
    elif (mesh.vertexColors):
        out.write('ColoredVertexData3D')
    else:
        out.write('VertexData3D')
    out.write('), &%sVertexData[0].vertex);\n' % basename)
    out.write('// glNormalPointer(GL_FLOAT, sizeof(')
    if (mesh.faceUV):
        out.write('TexturedVertexData3D')
    elif (mesh.vertexColors):
        out.write('ColoredVertexData3D')
    else:
        out.write('VertexData3D')
    out.write('), &%sVertexData[0].normal);\n' % basename)
    if (mesh.faceUV):
        out.write('// glTexCoordPointer(2, GL_FLOAT, sizeof(TexturedVertexData3D), &%sVertexData[0].texCoord);\n' % basename)
    elif (mesh.vertexColors):
        out.write('// glColorPointer(4, GL_FLOAT, sizeof(ColoredVertexData3D), &%sVertexData[0].color);\n' % basename)
    out.write('// glDrawArrays(GL_TRIANGLES, 0, k%sNumberOfVertices);\n' % basename)
    out.write('// glDisableClientState(GL_VERTEX_ARRAY);\n')
    if (mesh.faceUV):
        out.write('// glDisableClientState(GL_TEXTURE_COORD_ARRAY);\n')
    elif (mesh.vertexColors):
        out.write('// glDisableClientState(GL_NORMAL_ARRAY);\n')
        out.write('// glDisable(GL_COLOR_MATERIAL);\n')
    out.write('// glDisableClientState(GL_NORMAL_ARRAY);\n\n\n')
   
    out.close()


filename = os.path.splitext(Blender.Get('filename'))[0]
Blender.Window.FileSelector(write_obj, "Export", '%s.h' % filename)


Но оказалось, что под 2.49 есть скрипт получше если скачать их все отсюда https://wiki.blender.org/index.php/Extensions:2.4/Py/Scripts/Bundles
Scripts->System->OpenGL-Code (.h)
Вдруг, кому-то пригодится...
Вот такой С++ код производит:

Код
/////////////////////////////////////////////////////////////////////////
//
//    00.h - Renderfunctions
//
//    This file was created by the OpenGL-Export-Script for Blender.
//
//    Export-Time: 03.08.2016, 02:21:13
//
//    Script written by Michael Gantenbrinker.
//
/////////////////////////////////////////////////////////////////////////

#ifndef __00_H__
#define __00_H__


/////////////////////////////////////////////////////////////////////////
// DEFINES
#define NUM_MESHES 1
#define NUM_LIGHTS 0


/////////////////////////////////////////////////////////////////////////
// CONSTANTS
// Vertex-Array for each Mesh
const float fVertices_1[8][3] = { {1.000000f, 1.000000f, -1.000000f}, {1.000000f, -1.000000f, -1.000000f}, {-1.000000f, -1.000000f, -1.000000f}, {-1.000000f, 1.000000f, -1.000000f},
{1.000000f, 0.999999f, 1.000000f}, {0.999999f, -1.000001f, 1.000000f}, {-1.000000f, -1.000000f, 1.000000f}, {-1.000000f, 1.000000f, 1.000000f}
 };
// Normal-Array for each Mesh
const float fNormals_1[8][3] = { {0.577349f, 0.577349f, -0.577349f}, {0.577349f, -0.577349f, -0.577349f}, {-0.577349f, -0.577349f, -0.577349f}, {-0.577349f, 0.577349f, -0.577349f},
{0.577349f, 0.577349f, 0.577349f}, {0.577349f, -0.577349f, 0.577349f}, {-0.577349f, -0.577349f, 0.577349f}, {-0.577349f, 0.577349f, 0.577349f}
 };

// Triangle-Indices for each Mesh

// Quad-Indices for each Mesh
const unsigned long ulQuadIndices_1[6][4] = { {0, 1, 2, 3}, {4, 7, 6, 5}, {0, 4, 5, 1}, {1, 5, 6, 2}, {2, 6, 7, 3}, {4, 0, 3, 7} };

// Array with Vertex-Array-Pointers
const float* pVertexPointers[] = {&fVertices_1[0][0]};
// Array with Normal-Array-Pointers
const float* pNormalPointers[] = {&fNormals_1[0][0]};
// Array with TriangleIndex-Array-Pointers
const unsigned long* pTriangleIndexPointers[] = {0};
// Array with QuadIndex-Array-Pointers
const unsigned long* pQuadIndexPointers[] = {&ulQuadIndices_1[0][0]};

// Array with Vertex-Array-Lengths
const unsigned long ulVertexLengths[] = {8};
// Array with TriangleIndex-Array-Lengths
const unsigned long ulTriangleIndexLengths[] = {0};
// Array with QuadIndex-Array-Lengths
const unsigned long ulQuadIndexLengths[] = {6};


void Init()
{
}

void Render(int iWidth = 1024, int iHeight = 768)
{
// Setup Projektion-Matrix
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
double dAspectRatio = (double)iWidth / (double)iHeight;
gluPerspective(45.0f, dAspectRatio, 1.0f, 100.0f);
glViewport(0, 0, iWidth, iHeight);
gluLookAt(5.0f, 5.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f);

// Setup Lights
float lPos[] = {5.0f, 5.0f, 5.0f, 1.0f};
float lDir[] = {-0.707f, -0.707f, -0.707f};
glLightfv(GL_LIGHT0, GL_AMBIENT,               StdColor_White);
glLightfv(GL_LIGHT0, GL_DIFFUSE,               StdColor_BrightGrey);
glLightfv(GL_LIGHT0, GL_SPECULAR,              StdColor_White);
glLightfv(GL_LIGHT0, GL_POSITION,              lPos);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION,        lDir);
glLightf (GL_LIGHT0, GL_SPOT_CUTOFF,           180.f);
glLightf (GL_LIGHT0, GL_SPOT_EXPONENT,         1.0f);
glLightf (GL_LIGHT0, GL_CONSTANT_ATTENUATION,  1.0f);
glLightf (GL_LIGHT0, GL_LINEAR_ATTENUATION,    0.6f);
glLightf (GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.06f);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
// Setup Scene-Content
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
float*         fVertices = 0;
float*         fNormals = 0;
unsigned long* ulTriangleIndices = 0;
unsigned long* ulQuadIndices = 0;
unsigned long* ulPtr = 0;

for(int i = 0; i < NUM_MESHES; i++)
{
fVertices = (float*)pVertexPointers[i];
fNormals = (float*)pNormalPointers[i];
ulTriangleIndices = (unsigned long*)pTriangleIndexPointers[i];
ulQuadIndices = (unsigned long*)pQuadIndexPointers[i];

if(ulTriangleIndices)
{
glBegin(GL_TRIANGLES);
unsigned long t = 0;
while(t < ulTriangleIndexLengths[i]*3)
{
ulPtr = &ulTriangleIndices[t];
glNormal3fv(&fNormals[ulPtr[0]*3]);
glVertex3fv(&fVertices[ulPtr[0]*3]);

glNormal3fv(&fNormals[ulPtr[1]*3]);
glVertex3fv(&fVertices[ulPtr[1]*3]);

glNormal3fv(&fNormals[ulPtr[2]*3]);
glVertex3fv(&fVertices[ulPtr[2]*3]);

t += 3;
}
glEnd();
}

if(ulQuadIndices)
{
glBegin(GL_QUADS);
unsigned long q = 0;
while(q < ulQuadIndexLengths[i]*4)
{
ulPtr = &ulQuadIndices[q];
glNormal3fv(&fNormals[ulPtr[0]*3]);
glVertex3fv(&fVertices[ulPtr[0]*3]);

glNormal3fv(&fNormals[ulPtr[1]*3]);
glVertex3fv(&fVertices[ulPtr[1]*3]);

glNormal3fv(&fNormals[ulPtr[2]*3]);
glVertex3fv(&fVertices[ulPtr[2]*3]);

glNormal3fv(&fNormals[ulPtr[3]*3]);
glVertex3fv(&fVertices[ulPtr[3]*3]);

q += 4;
}
glEnd();
}
}
}

#endif  /* __00_H__ */

Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 03 Август 2016, 15:28:50
Цитировать
1. Всегда можно найти место на просторах сети, где подскажут конкретно по существу проблемы, потому что достаточное количество литературы и примеров.
2. Указатели и ссылки - это реально круто. Манипуляция данными происходит по адресам этих данных в оперативке. В этом зарыта скорость выполнения.
3. ООП разгружает мозг, раскладывая всё по полочкам. Я поверил на слово Страуструпу, когда прочитал в книге его рекомендации почему не стоит использовать С там, где это совсем не требуется, почему не стоит на С++ писать как на С, используя структуры, отказываясь от классов и тому подобное...
1. Согласен, что инфы много больше... но больше и путаницы, как у меня вышло графической библиотекой от Bolrand.
2. Указатели присутствуют
C/C++:
Код
int a;
int *p;
p = &a;
*p = 123;
Freebasic:
Код
dim a as integer
dim p as integer ptr
p = @a
*p = 123

3. ООП есть и в Freebasic http://freebasic.justforum.net/t51-topic Пишут, что: Главное не забывать разрушать объекты иначе будет утечка памяти. Подробно: http://free-basic.ru/oop_1.html

Сравнение C/C++ и Freebasic http://free-basic.ru/helprus/TblComparisonC.html
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 04 Август 2016, 00:48:07
Ланухумыч, у тебя есть желание продолжать заниматься самообразованием? Или проще накопить денег на тот же Win+V-Ray + железо (или иной рендерер под винду) и рендерить относительно шустро, без всех этих заморочек? :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 04 Август 2016, 16:51:11
Ланухумыч, у тебя есть желание продолжать заниматься самообразованием? Или проще накопить денег на тот же Win+V-Ray + железо (или иной рендерер под винду) и рендерить относительно шустро, без всех этих заморочек? :)
Всё идёт по расписанию. :)
У меня два раза в неделю курсы, где меня учат программировать изготовление деталей, и там совсем не С++. Морис просит помочь интегрировать мой код в официальную версию аддона "render_povray", там Python. Разработчик Povray ищет инфу по BezierMesh, который он хочет внедрить в рендерер, и, я пытался помочь ему находя решения в исходниках рендеров. У меня в голове сейчас такая каша, но я ещё успеваю думать про эту тему, ибо как ни странно, но желание у меня пока ещё осталось. :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 04 Август 2016, 17:03:45
Цитировать
Морис просит помочь интегрировать мой код в официальную версию аддона "render_povray", там Python.
Это очень хорошая новость. Мои поздравления!
Цитировать
У меня в голове сейчас такая каша, но я ещё успеваю думать про эту тему, ибо как ни странно, но желание у меня пока ещё осталось. :)
Понял... :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 04 Август 2016, 17:33:16
Цитировать
Морис просит помочь интегрировать мой код в официальную версию аддона "render_povray", там Python.
Это очень хорошая новость. Мои поздравления!
Для меня это не очень хорошая новость. Дело в том, что я написал импорт повреевской сцены в блендер с целью, о которой меня просили на офсайте поврея. Там люди боятся блендера, но хотят использовать его возможности для просчёта физики. Мой коннектор теперь может загружать повреевские объекты, чтобы в блендере накинуть на них ткань и прочее. Морису эта идея понравилась, он перенёс импорт в официальную версию, но ему теперь подавай импорт с материалами, блин. Зачем ему это, я не знаю, но обижать его не хочется, тем более, что моё имя фигурирует в списке разработчиков официальной версии. Нужно держать марку фирмы :)
А, там же в текстурах чёрт ногу сломает. Этот формат SDL - не лучшее, что можно было придумать, но Кристоф Липка, главный разработчик поврея уважает пользователя, и желает, чтобы тот писал как ему вздумается, хоть через жопу...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 04 Август 2016, 20:43:51
Кстати, про оптимизацию в С++.
Я написал тестовый код, который по клику левой кнопкой мышки запускает цикл
Код
	for (int i = 0; i< 242000000; i++)
temp+=temp;
242 миллиона раз к результату прибавляется единица
компилирую в Geany файл командой
g++ -Wall -c "%f" -std=c++11 -lFOX-1.6
собираю командой g++ -Wall -o "%e" "%f" -std=c++11 -lFOX-1.6
тестирую и делаю скриншот заголовка
далее,
собираю командой g++ -Wall -o "%e" "%f" -std=c++11 -lFOX-1.6 -O5 (-О5 - команда оптимизации, можно написать -Ofast)
снова запускаю и делаю скриншот.
Показываю результаты:
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 04 Август 2016, 21:00:55
Код вот:
Код


#include "fox-1.6/fx.h"
#include <time.h>
#include <iostream>

using namespace std;


class ImageWindow : public FXMainWindow{
  FXDECLARE(ImageWindow)

protected:
  ImageWindow(){}
  FXStatusBar       *statusbar;

private:
    FXCanvas *canvas;
    FXColor bgColor = FXRGB(0, 0, 0);

public:
    enum {
        ID_CANVAS = FXMainWindow::ID_LAST,
    };

    long onPaint(FXObject *, FXSelector, void *);
    long onMouseDown(FXObject *, FXSelector, void *);

public:
  ImageWindow(FXApp* a);
  virtual void create();
  virtual ~ImageWindow();
  };

FXDEFMAP(ImageWindow) ImageWindowMap[] = {
        FXMAPFUNC(SEL_PAINT, ImageWindow::ID_CANVAS, ImageWindow::onPaint),
        FXMAPFUNC(SEL_LEFTBUTTONPRESS,   ImageWindow::ID_CANVAS, ImageWindow::onMouseDown)
};

FXIMPLEMENT(ImageWindow, FXMainWindow, ImageWindowMap, ARRAYNUMBER(ImageWindowMap))

ImageWindow::ImageWindow(FXApp* a):FXMainWindow(a,"FOX Render",NULL,NULL,DECOR_ALL,0,0,850,600,0,0){

        FXHorizontalFrame *container=new FXHorizontalFrame(this,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED);
        container->setBackColor(FXRGB(226,223,222));
        FXHorizontalFrame *chartwell=new FXHorizontalFrame(container,FRAME_SUNKEN|LAYOUT_FILL_X|
                                                                LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT,
                                                                0,0,0,0,10,10,10,10);
        canvas = new FXCanvas(chartwell, this, ID_CANVAS, LAYOUT_FILL_X|LAYOUT_FILL_Y);
        //statusbar=new FXStatusBar(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|STATUSBAR_WITH_DRAGCORNER);
        //statusbar->getStatusLine()->setNormalText("");
}

ImageWindow::~ImageWindow() {}

void ImageWindow::create() {
    FXMainWindow::create();
    show(PLACEMENT_SCREEN);
}

long ImageWindow::onPaint(FXObject *, FXSelector,void *ptr) {
    FXEvent *ev = (FXEvent *) ptr;
    FXDCWindow dc(canvas, ev);
    dc.setForeground(bgColor);
    dc.fillRectangle(0,0,canvas->getWidth(),canvas->getHeight());

    return 1;
}

timespec diff(timespec start, timespec end);

long ImageWindow::onMouseDown(FXObject *, FXSelector, void *ptr){
timespec time1, time2;
int temp = 0;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
for (int i = 0; i< 242000000; i++)
temp+=1;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
    long b = 0;
    FXString name, ftemp;
    name = FXStringVal(diff(time1,time2).tv_nsec);
    ftemp = FXStringVal(temp);
    this->setTitle("Render Time: "+name+" nanosecond   "+ftemp);
    //statusbar->getStatusLine()->setNormalText("Render Time: "+name+" nanosecond");
    //statusbar->repaint();
    return b;
}
timespec diff(timespec start, timespec end)
{
timespec temp;
if ((end.tv_nsec-start.tv_nsec)<0) {
temp.tv_sec = end.tv_sec-start.tv_sec-1;
temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
} else {
temp.tv_sec = end.tv_sec-start.tv_sec;
temp.tv_nsec = end.tv_nsec-start.tv_nsec;
}
return temp;
}

int main(int argc,char *argv[]){
  FXApp application("FoxTest","FoxTest");
  application.init(argc,argv);
  new ImageWindow(&application);
  application.create();
  return application.run();
  }
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 06 Август 2016, 18:25:47
Так, ну, вроде бы подготовил гуёвину. Разобрался, как создавать и перерисовывать картинку. Вывод времени рендера вывел в статусбар, как у всех. Приделал кнопки.
Ну, теперь можно и приступать непосредственно к полётам.
Всё же мне кажется, что поскольку я собираюсь рендерить сцены блендера, то нужно у интернала позаимствовать камеру, лампочки, меш, и материалы, а, если получится и рейтрейсинг диффузных слоёв. Интернал очень хорошо считал то, что не зеркалит и то, что не стеклянное...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 06 Август 2016, 22:25:17
Завтра напишу CMakeLists.txt,  создам дерево проекта, размещу на Гитхабе и кину ссылку.
Как будут собирать пользователи Виндовс - меня это не волнует, придётся им искать способы и методы вручную и самостоятельно. :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 07 Август 2016, 01:16:47
Честно сказать, libfox, не лучшее, что можно было выбрать. Попытался зарегиться на форуме получая  ответы - даже не получил письмо активации...
Fox - это лицензия GPL, это не трансформирующееся во времени виджеты...
Люблю КДЕ - это крутой десктоп и по возможности всегда юзаю кеды, но, надежды на него нет. Смена версий Qt иногда делает систему неработоспособной...и лицензия...
GTK -  гондоны. Что они сделали из стабильной версии gtk2 - расстрелять без суда и следствия...
FLTK -  быстродействующий тулкит, с количеством виджетов опережающих всех. Особенно для графики.. Я и его не взял. Ограничения в шрифтах. FLTK имеет несколько собственных шрифтов, которые в линуксе переназначить нужно особое умение...
Я беру то, во что не вложены ограничения...
Меня достаточно ограничили в жизни, чтобы я возненавидел любые ограничения.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 07 Август 2016, 06:10:24
Вот интересного научного отечественного по теме почитать:

http://www.graphicon.ru/html/2013/papers/207-210.pdf
http://istina.msu.ru/media/dissertations/dissertation/8be/5fa/9651265/08_frolov_diss_compressed.pdf

Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 07 Август 2016, 10:05:01
Вот интересного научного отечественного по теме почитать:

http://www.graphicon.ru/html/2013/papers/207-210.pdf
http://istina.msu.ru/media/dissertations/dissertation/8be/5fa/9651265/08_frolov_diss_compressed.pdf
Спасибо, почитаю. Тут динозавры твои есть. Но, мы до GPU ещё не добрались. :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 07 Август 2016, 13:08:55
Цитировать
Тут динозавры твои есть.
Это одна из известных  сцены для теста рендерера, как и Sponza Atrium. Качал отсюда: http://www.3drender.com/challenges/
Challenge #17: Natural History
Цитировать
Но, мы до GPU ещё не добрались. :)
Пусть инфа поваляется тут :)  Случайно наткнулся...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 07 Август 2016, 13:16:35
В общем, не стану я пока создавать проект на Гитхабе, а CMakeLists.txt написал. Уже у меня четыре файла проекта есть. :)
Можно в магазин уже идти.
Samovar, ты вроде как писал, что будешь пробовать libFox устанавливать.
Вот файлы  (Аж 2,4 кБ в 7-zip!!!):
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 07 Август 2016, 13:21:42
Я пока не освоил make, чтоб собрать предложенную тобой стороннюю библиотеку для GUI. http://free-basic.ru/aboutmakefile.html
Полезная вещь... ковыряю потихоньку. http://rus-linux.net/nlib.php?name=/MyLDP/algol/gnu_make/gnu_make_3-79_russian_manual.html
может, что и не так делаю... потихоньку разберусь ...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 07 Август 2016, 13:32:53
Код
Я пока не освоил make, чтоб собрать предложенную тобой стороннюю библиотеку для GUI.
У тебя какая система и сколько бит? Я попробую minGW в линуксе.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 07 Август 2016, 13:40:14
Я пока не освоил make, чтоб собрать предложенную тобой стороннюю библиотеку для GUI. http://free-basic.ru/aboutmakefile.html
Полезная вещь... ковыряю потихоньку. http://rus-linux.net/nlib.php?name=/MyLDP/algol/gnu_make/gnu_make_3-79_russian_manual.html
может, что и не так делаю... потихоньку разберусь ...
Зачем тебе это надо? Устанавливаешь MinGW и по иструкции: configure, make, make install.
Ты что Makefile собрался писать? Он создастся автоматически командой configure.
А для других случаев лучше Смаке использовать для генерации makefile.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 07 Август 2016, 17:09:51
Собрал рендер, написанный тем же программистом, что и для GPU писал, о котором я упоминал вначале . При запуске показывает тестовую анимацию с летающими шариками. Обновление происходит где-то за секунду. Но, я посмотрел код, вроде как на одном ядре оно ездит.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 07 Август 2016, 19:02:53
Прикольно сделано, но  мне  пока не понятно ... Отсутствуют знания GLSL


(https://blenderartists.org/forum/attachment.php?attachmentid=212798&d=1358682471)

https://blenderartists.org/forum/showthread.php?278962-GLSL-realtime-raytracer-bauble
На японском, видимо :) http://kioku.sys-k.net/4kgfxmon/howto/howto04.htm
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 07 Август 2016, 19:26:52
В принципе, если возможно прикрутить ту хрень, которую я использовал для интернала и добавить семплов+AA, то теоретически можно получить подобие Суслика на GLSL.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 07 Август 2016, 20:02:16
В принципе, если возможно прикрутить ту хрень, которую я использовал для интернала и добавить семплов+AA, то теоретически можно получить подобие Суслика на GLSL.
Какую хрень и куда прикрутить? Что-то я плохо ориентируюсь в твоих данных.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 07 Август 2016, 20:18:50
Прикольно сделано, но  мне  пока не понятно ... Отсутствуют знания GLSL
Да, прикольно. Только непонятно, как сохранять видео...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 07 Август 2016, 20:25:09
Прикольно сделано, но  мне  пока не понятно ... Отсутствуют знания GLSL
Да, прикольно. Только непонятно, как сохранять видео...
Да это просто прототип в BGE :) Но можно попробовать и тут: добавить актуатор Game->Sсreenshot и менять имя файла скриптом на Python. Но я в  Python не шарю...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 07 Август 2016, 20:43:34
Да это просто прототип в BGE :) Но можно попробовать и тут: добавить актуатор Game->Sсreenshot и менять имя файла скриптом на Python. Но я в  Python не шарю...
Я перевёл некоторые реплики на бленартисте. Тут даже объекты созданы шейдерами. Блендер здесь просто в роли окна openGL. Скрин, может, и можно сделать, но не для чего. Прежде надо и GLSL изучить, и скриптописание в BGE. Но, опять же таки скриншотить проблемно в FullHD. Или это можно развернуть в полный экран. Я что-то не смог. Игра запускается только из меню, а при запущенной игре кнопки не работают.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 07 Август 2016, 20:44:48
В принципе, если возможно прикрутить ту хрень, которую я использовал для интернала и добавить семплов+AA, то теоретически можно получить подобие Суслика на GLSL.
Какую хрень и куда прикрутить? Что-то я плохо ориентируюсь в твоих данных.
Изменять вектор отражения случайным образом по полусфере для каждого семпла луча. Затем из них вычислить среднее значение - это и будет цвет пикселя вторичного освещения. Но это,естественно, будет уже дольше вычисляться, чем зеркальные отражения :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 07 Август 2016, 20:50:19
Да это просто прототип в BGE :) Но можно попробовать и тут: добавить актуатор Game->Sсreenshot и менять имя файла скриптом на Python. Но я в  Python не шарю...
Я перевёл некоторые реплики на бленартисте. Тут даже объекты созданы шейдерами. Блендер здесь просто в роли окна openGL. Скрин, может, и можно сделать, но не для чего. Прежде надо и GLSL изучить, и скриптописание в BGE. Но, опять же таки скриншотить проблемно в FullHD. Или это можно развернуть в полный экран. Я что-то не смог. Игра запускается только из меню, а при запущенной игре кнопки не работают.


Надо вникнуть в вопрос... То, что объекты созданы шейдерами, пока не сильно отпугивает, если пробовать сделать подобное на Си или Freebasic...

А зачем нажимать кнопку, чтобы получить скриншот?.. я ж писал про актуатор...Задай интервал времени новому сенсору Always и свяжи этот сенсор с актуатором Game через скрипт Python, который в актуаторе будет изменять имя файла,каждый раз когда срабатывает сенсор.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 07 Август 2016, 20:53:04
Цитировать
А зачем нажимать кнопку, чтобы получить скриншот?
Кнопку нужно жать, чтоб развернуть в полный экран.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 07 Август 2016, 20:56:55
Цитировать
А зачем нажимать кнопку, чтобы получить скриншот?
Кнопку нужно жать, чтоб развернуть в полный экран.
Справа в параметрах рендеринга надо выставить разрешение  Standalone Player (или включить галку Desktop), включить галку Fullscreen и нажать кнопку Start
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 07 Август 2016, 21:03:07
Цитировать
Надо вникнуть в вопрос... То, что объекты созданы шейдерами, пока не сильно отпугивает, если пробовать сделать подобное на Си или Freebasic...
GLSL и есть урезанный С. В принципе, можно попробовать. Нужно подумать. Я где-то видел уроки на русском по опенгл. Там есть, как загружать объекты в сцену и как вставлять коды шейдеров в код OpenGL. Реалтайм, конечно, не получится...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 07 Август 2016, 21:11:01
Ага, вот ссылка:
https://triplepointfive.github.io/ogltutor/
ну и вот:
http://pmg.org.ru/nehe/
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 07 Август 2016, 21:18:45
Ага, вот ссылка:
https://triplepointfive.github.io/ogltutor/
ну и вот:
http://pmg.org.ru/nehe/
Не, малёха не то, но тоже нужно...
Вот по GLSL инфа:
http://masandilov.ru/glsl/
https://www.opengl.org/documentation/glsl/


Кто-то уже что-то пытался...https://code.google.com/archive/p/glsl-raytracer/downloads
Но, чую, врубаться придётся долго :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 07 Август 2016, 23:06:53
Цитировать
Кто-то уже что-то пытался...https://code.google.com/archive/p/glsl-raytracer/downloads
Это очень даже хорошо. Я собрал этот рэйтрэйсер. У нас, можно сказать, уже почти всё есть для изучения языка GLSL.
Оно, правда для винды написано, ибо файл сборки только для VisualStudio. Пришлось потренироваться писать CMakeLists.txt, чтобы собрать в линуксе. SDL глючит, не закрывает окно, приходится процесс убивать из консоли.
Но суть такова: рядом с бинарником должен располагаться текстовой файл rt.frag с кодом GLSL. Он есть, но его теперь можно редактировать, изучая результаты сразу, запуская программу.
Вот такая вот анимация крутится, в заголовке окна показывает FPS. На момент снимка было 60.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 08 Август 2016, 00:18:19
Круто! Я его пока не победил, хотя пытался :) Завтра попробую разобраться...
Тем не менее, мне удалось записать последовательность .png с помощью BGE и без Python. Просто надо в файле указать шаблон нумерации с помощью символов решётка "#", и связать сенсоры с актуаторами как на картинке вложения. Скорость упала примерно раза 2, но у меня ЖД медленный старенький сейчас... Регулировать можно регулируя Refresh Rate в панели рендера и задавая во втором актуаторе Always количество пропущенных кадров. Может кому-то пригодится.
ПС: если цеплять к одному актуатору Always, последовательность не пишется, или скорость падает в десятки раз... Не знаю почему так  ???  Формат файла зависит от формата изображения в которое рендерит анимацию Интернал. Т.е. можно и в .exr, и в .jpg, и в .bmp, и т.п. картинки рендерить...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 08 Август 2016, 17:50:55
Цитировать
Тем не менее, мне удалось записать последовательность .png с помощью BGE и без Python.
Очень хочется посмотреть, как ты без Python будешь помещать в сцену объекты и присваивать им шейдеры. Я, честно сказать, ничего не знаю про актуаторы, ибо никогда не интересовался движком BGE, но, когда увижу как у тебя вместо кубика в этой сцене будет ходить зеркальный человек в реалтайме, то актуаторы станут для меня смыслом жизни... :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 08 Август 2016, 19:17:23
Ты спросил, я ответил...
Ещё по теме...
Чтоб отбить интерес к GLSL https://habrahabr.ru/post/96122/
https://www.youtube.com/watch?v=eef9EgOpBh4 ссылка на исходники под видео.
Всё это дело достаточно  прикольно работает с математическими поверхностями
http://fractalus.ru
Песочница http://glslsandbox.com/e#20839.4


Но конечно, возник вопрос про рендер полигональных объектов
http://www.gamedev.ru/code/forum/?id=166798
вот ссылки оттуда:
(http://gpurt.sourceforge.net/output.jpg)
http://www.clockworkcoders.com/oglsl/rt/  - исходники и документация в комплекте
тут, тоже интересно: http://courses.graphicon.ru/main/cg/2011/assigns/4
ещё http://www.cs.princeton.edu/courses/archive/spr16/cos426/precepts/p06-glsl.pdf
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 08 Август 2016, 19:38:49
Цитировать
Чтоб отбить интерес к GLSL
Дело в том, что эту игрушку всё же можно реализовать, написав простой аддон, как мне кажется. Я уже прикручивал PySide к Блендеру, но тогда это было для других целей, я писал редактор карт цвета для Поврея.
Вот пример: слева окно опенгл, справа результат рендера. В примере, правда, нужно вводить размер выходного изображения, но, это можно и автоматизировать. Как видишь, можно получить любой размер ничего не растопыривая на весь экран.
Надо попробовать ту демосцену с GLSL в блендере перенести, заменив шестереньки, посмотреть, получится ли...

Цитировать
Но конечно, возник вопрос про рендер полигональных объектов
Как видишь, в сцене полигональные объекты - шестереньки. Другой вопрос: я не вижу нигде в ссылках стекла с преломлением.
Но, для этого есть наложение одного изображения на другое...текстуры окружения и так далее...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 08 Август 2016, 21:09:40
Ещё один OpenGL рейтрейсер в копилку
https://www.youtube.com/watch?v=ycSOnGzbNO4
https://github.com/StanEpp/OpenGL_Raytracing
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 08 Август 2016, 21:25:44
Ещё один OpenGL рейтрейсер в копилку
https://www.youtube.com/watch?v=ycSOnGzbNO4
https://github.com/StanEpp/OpenGL_Raytracing
Вторая ссылка интересная. Там используется в винде окно GLFW3. Я этим уже давно интересуюсь. GLFW3 - это продвинутая альтернатива FreeGlut. FreeGlut - морально устарел, давно заброшен. GLFW3 поддерживает версии OpenGL - 4.x
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 08 Август 2016, 22:44:14
В общем, полно этих рейтрейсеров с исходниками. Бери любой и ковыряй, если хочется.
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 09 Август 2016, 21:24:11
Ланухумыч, я нашел  цикл лекций по компьютерной графике на русском. Ранее мне попадались только на английском.
Думаю, полезно будет посмотреть весь курс, если есть желание вникнуть серьёзно.
https://www.lektorium.tv/lecture/13345
Конкретно по трассировке лучей:
Лекция 8 | Компьютерная графика | Виталий Галинский | Лекториум
https://www.youtube.com/watch?v=CKyiXdxXwbE
материалы лекции в формате .ppt https://www.lektorium.tv/sites/lektorium.tv/files/additional_files/20111106_computer_graphics_galinsky_lecture08_tracing.ppt
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 10 Август 2016, 17:07:04
В общем, возвращаемся к своим баранам.
Инфы предостаточно, знать бы ещё, насколько она конструктивна.
Первая непонятка, с которой я столкнулся - это kd-tree или octree?
На русскоязычном ресурсе написано:
Цитировать
Oc-tree
Забудьте про это, октодерево неэффективно и сложно. Вот тут приводится сравнение множества статей по тваверсу октодеревьев http://tog.acm.org/resources/RTNews/html/rtnv12n2.html#art4.
Это тут:
http://ray-tracing.ru/articles183.html
Сразу хочется не верить! И не очень хочется сравнивать самостоятельно.
Ибо, мы все знаем, что интернал использует octree, и Art of Illusion использует octree. Вероятно, авторы рабочих программ чего-то не дочитали, и написали неэффективный код, а теоретики знают, как делать эффективно, но подтвердить это работающим кодом не спешат уже лет пятнадцать - двадцать. :)
Так что, всё же придётся самостоятельно проверить kd-tree или octree, или что-то другое?
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 10 Август 2016, 18:59:23
Интернал и Суслик сейчас используют BVH. http://ray-tracing.ru/articles184.html
Вроде, пишут, что это эффективнее ... ...
Но я б на твоём месте на это сильно пока не заморачивался, а пытался врубиться и изобразить алгоритм трассировки лучей программно прежде... потом можно эти алгоритмы организации объектов в памяти внедрить в код...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 10 Август 2016, 21:59:52
Или напиши рейтрейсер на Python вначале, в котором ты хорошо соображаешь, чтобы самому понять основные принципы. Потом перепишешь на С++. Думаю, это на данный момент самая верная стратегия...
З.Ы. я тут вычитал, что под GPU рекурсивные вызовы функции сделать проблематично, поэтому вместо рекурсий используют циклы... Теперь понятно почему Суслик называется Сусликом :)
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 11 Август 2016, 09:14:35
:) Простой рейтрейсер на Python https://gist.github.com/sevko/c3ed2430e96b89dd3177
:) Рейтрейсер на JavaScript https://habrahabr.ru/post/112944/
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 14 Август 2016, 21:15:45
:) Простой рейтрейсер на Python https://gist.github.com/sevko/c3ed2430e96b89dd3177
:) Рейтрейсер на JavaScript https://habrahabr.ru/post/112944/
Да, насмотрелся я уже на все эти рейтрейсеры. Отчасти, начал понимать тех, кто начал и не дописал. Какое же всё глючное! Я не про коды рейтрейсеров, а про тулкиты и всякие либы, которые, якобы, можно использовать для серьёзных проектов. SDL - виснет. Qt ошибки сегментирования выдаёт на ровном месте: сменил положение камеры, вместо пяти, в примере, поставил 10 - ошибка сегментирования. Как камеру анимировать? С Qt проблемы и раньше встречал, но, думал, случайно, нет - это закон. Наверное, поэтому и нет ни одного, хоть самого простого, но без глюков, трёхмерного редактора на Qt. Собрал OpenGL-raytracer на GLFW3 - чёрное окно. Я эти шейдеры два дня прикручивал, выискивая пути с обратными слешами, а оно, раз, и глюк. Qt-creator - г... создал проект, сборка не находит инклудов, в CodeBlock мне не удалось собрать ни одного проекта, написанных для CodeBlock. Разумеется, это всё каким-то замысловатым образом решается грамотными программистами, но нах это предлагать новичкам, если оно не готово работать из коробки - х.з.
Samovar, не давай мне больше ссылок, не сбивай меня с курса. Я решил портировать уже готовый код на Джаве, я уже говорил, и я это сделаю. Сегодня я понял принцип портирования кода, врубился, и, буду писать...
Интересно, но все мои эксперименты с libFOX не выдали ни одного глюка. Поэтому, и примеров не найти. Видать, профи юзают, а чтоб следы запутать пишут на Qt примеры. :) :) :)
Python я похерил из-за GIL. Он не даёт возможности использовать параллельные вычисления, используя все ядра проца. Там есть какой-то бубен, в который можно постучать, но шаманизм меня уже утомил, пусть там Кастанеда разбирается :) :) :)
Java и все вытекающие из этого последствия - не для компьютерной графики твёрдо. Это для такой вот херни, и не больше:
http://startandroid.ru/ru/uroki/vse-uroki-spiskom.html
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 15 Август 2016, 06:38:31
Цитировать
Samovar, не давай мне больше ссылок, не сбивай меня с курса.
Как угодно, но замечу, что это была твоя идея - написать рейтрейсер... 
Тогда создам другую тему по рейтрейсеру на FB...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 15 Август 2016, 17:44:17
Цитировать
Samovar, не давай мне больше ссылок, не сбивай меня с курса.
Как угодно, но замечу, что это была твоя идея - написать рейтрейсер... 
Тогда создам другую тему по рейтрейсеру на FB...
Ты не обижайся, но моя идея не подразумевала написание рейтрейсера с нуля. Я сразу об этом объяснил sungreen, когда он спросил:"А, с нуля, слабо?" Я сразу говорил, что хочу использовать уже готовое, написанное на С\С++. И присобачить туда уже готовое, работающее, но неэффективно, ибо, написано на Java. Именно, полноценное, а ни тестовые варианты, сбивающие с толку.
Другие языки - другая философия. Я как-то прочитал про Хаскель: такой язык, такой язык, требует иной склад ума, поэзия...
Для поэзии есть пакет Libreoffice, сочиняй там и не горюй. Я выделил два параметра, от которых шаг вправо, шаг влево - попытка к бегству. Скорость и экономичность, всё. Хаскель философский проигрывает в скорости вычислений Джаве, а тем более С\С++ почти в два раза. Мне что, кодом любоваться или кадры извлекать?
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: Samovar от 15 Август 2016, 17:55:14
Ланухумыч, да делай что хочешь, только меня не зови уже быть тебе "советчиком", потому, что я в этой теме не шарю, как и писал тебе до этого... Луше СамСуСаму напиши и пригласи поучаствовать... Он активно интересовался этой твоей темой.
А я попробую ковырять свою тему... нихрена не выйдет, но интересно как и в плане написания текстурных плагинов (но плагины потом)... :) 
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 15 Август 2016, 18:26:01
Ланухумыч, да делай что хочешь, только меня не зови уже быть тебе "советчиком", потому, что я в этой теме не шарю, как и писал тебе до этого... Луше СамСуСаму напиши и пригласи поучаствовать... Он активно интересовался этой твоей темой.
Я СамСуСаму писал, он молчит. Я уже привык к тому, что любые мои действия не поддерживаются. Я ж нелюдь. :) И хочу того, чего другие не хотят...
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 28 Октябрь 2016, 21:50:05
Разбираясь по теме взялся сделать povanim. Задумка такая: при просчёте анимации избавиться от передачи огромных массивов текстовым файлом. Кроме того, не передавать данные, вообще, если к объекту не применялись модификаторы, деформирующие сетку. Таким образом, в отличие от других сторонних рендеров, мы будем тратить время только на передачу изменённых в кадре данных, при чём большие массивы будут передаваться напрямую из питона в код С++.
https://github.com/Lanuhum/Povanim
Название: Re: Рейтрейсер для анимации на GPU.
Отправлено: LanuHum от 25 Декабрь 2016, 16:45:32
оставлю ссылку на ещё один рейтрейсер на С++
студент универа накалякал код.
Quick and Dirty Raytracer
https://github.com/KholdStare/qndraytracer