Комментарии 19
Хорошо бы исходники на гитхабе, было бы гораздо удобнее.
Почему не используете libnoise или Accidental Noise Library?
Не плохо было бы реализовать всё тоже самое, но на GPU.
Скорость должна увеличиться на порядок, а то и два.
Скорость должна увеличиться на порядок, а то и два.
А я и хотел сначала сделать это на гпу. Но после того как увидел на сколько сильно может отличаться результат на разных гпу, передумал.
Для данной задачи результат на разных гпу должен быть едва ли не bit-perfect одинаковый.
Разное получается, если выпендриваться.
Разное получается, если выпендриваться.
Ну так я и выпендривался…
Простая формула гпсч: fract(sin(dot(gl_FragCoord.xy ,vec2(12.9898,78.233))) * 43758.5453)
Результат: интегрированный гпу (какой то старый офисный селерон) и GeForce GTX460 (справа)
Простая формула гпсч: fract(sin(dot(gl_FragCoord.xy ,vec2(12.9898,78.233))) * 43758.5453)
Результат: интегрированный гпу (какой то старый офисный селерон) и GeForce GTX460 (справа)
Я рассматривал такой вариант. Диаграмма Вороного хорошо бы подошла для раскраски, но ячеистая текстура больше подходит для создание рельефности и теней между камнями.
Используемая в статье ячеистая текстура (одна из вариаций Cellular или Worley noise) получает интенсивность как разницу расстояний между второй и первой ближайшей контрольной точкой. В результате 0 (чёрный цвет) получается как раз на границе ячеек диаграммы Вороного. Но кроме границ, получаются еще и холмы в центре ячейки. К тому же алгоритм идеально ложится на GPU.
Крутяк!
Однако, отмечу, что то, что вы называете шумом Перлина, таковым не является. На самом деле у вас фрактальный value noise, а оригинальный шум Перлина несколько сложнее.
Кроме того, у вас довольно странные места в коде, много их.
Например, вот это
значительно и непредсказуемо дороже, чем просто при надобности делать
Однако, отмечу, что то, что вы называете шумом Перлина, таковым не является. На самом деле у вас фрактальный value noise, а оригинальный шум Перлина несколько сложнее.
Кроме того, у вас довольно странные места в коде, много их.
Например, вот это
delete[] interpolateTable;
interpolateTable = new float[f];
значительно и непредсказуемо дороже, чем просто при надобности делать
(1.0f-cosf(a))*0.5f
Почему дороже? Доступ к переменной дешевле чем вычисление. Я тестировал оба варианта и брать готовое значение оказалось дешевле. Если вы про дорогое выделение памяти, то оно происходит всего несколько раз по сравнению с многими тысячами вычисления значений.
Потому что это потенциальное прерывание и уход в ядро на неизвестно сколько миллисекунд. Высвобождение памяти тоже может быть очень не бесплатным.
Если и предрассчитывать таблицы, то где-то заранее и (квази-)статичного размера. При этом надо иметь в виду размер кэшей, промах по которым может нарушать «Доступ к переменной дешевле чем вычисление».
Если и предрассчитывать таблицы, то где-то заранее и (квази-)статичного размера. При этом надо иметь в виду размер кэшей, промах по которым может нарушать «Доступ к переменной дешевле чем вычисление».
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Процедурное текстурирование: генерация текстуры булыжника