Несколько месяцев назад я написал на C++ плагиат (высокое качество) дзен фотон и хочу начать с нуля. Было довольно весело, и мне удалось получить немного хорошие результаты. Самым большим узким местом в производительности была часть рисования линий, поскольку мне нужно было нарисовать миллионы линий, чтобы «отследить лучи».
В итоге я использовал Кодекс Мики Элизабет Скотт непосредственно для ее github, что было быстрее, чем все методы, которые я пробовал. Но мне было интересно, как я могу рисовать линии еще быстрее. Дело в том, что мне нужно не только нарисовать миллионы линий, но мне нужно их «сложить».
Моя программа была разделена на две основные задачи. Первый заключался в случайном отбрасывании лучей от источников света, вычислении пересечений с объектами, их отражении и т. д.
Второй частью было рисование линий. Окончательное изображение представлялось в виде простого двойного вектора (3x64 бита на каждый пиксель), а рисование линии заключалось в добавлении значений к этому вектору. Конкретно, когда я использовал алгоритм Брезенхема, я сделал +=1 ячейкам вектора, которые соответствовали пикселям, по которым проходит линия.
Изображение было визуализировано путем сопоставления значений этого массива с [0,255]. Затем я мог играть с яркостью, делать гамма-коррекцию и т. д.
Я попробовал демонстрационные коды OpenGL и Cairo для рисования линий. Но я не мог получить желаемое поведение: добавление линий в массив пикселей (или поверхность, или буфер, или что-то еще) с хорошей точностью, а затем рендеринг изображения из этого массива.
Есть ли у вас какие-либо идеи о том, как я мог бы быстро рисовать линии друг над другом, чтобы я мог манипулировать ими, как я только что описал?
Эту процедуру рисования линий можно было бы ускорить, если бы внутренний цикл работал только с целыми числами (преобразования double в int можно убрать). И, возможно, развёртывание цикла несколько раз тоже помогает.





Вы уверены, что нужен double, а float не подходит?