Как создать шаблонный объект с переменной плотностью в реальном времени?

8

Предположим, что существует некоторое значение p, рассчитанное для каждого кадра, которое непрерывно изменяется на поверхности объекта. Значение pопределяет плотность некоторого рисунка на поверхности. Например, в случае только двух возможных плотностей, если p < 0.3это высокая плотность, в противном случае она низкая.

Я подумал о простом высокоуровневом решении: создать две текстуры, каждая из которых имеет разную плотность, и основываясь на значении pвыборки из соответствующей. Однако есть проблема с границей между высокой и низкой плотностями.

Вот пример, чтобы проиллюстрировать проблему (обратите внимание, что моя проблема не является исключительной для этого примера шаблона точек. Я опишу шаблоны, с которыми я работаю позже):

введите описание изображения здесь

А вот пороговое значение между низким и высоким (отображается на текстуре с высокой плотностью, но это не имеет значения.) Если под линией, это означает, что текстуру с высокой плотностью следует выбирать.

введите описание изображения здесь

И, наконец, вот сравнение между желаемым и тем, что на самом деле произойдет с использованием этого метода:

введите описание изображения здесь

Проблема состоит в том, что, когда круг только высокой плотности пересекает линию, он будет игнорироваться, когда pуказывает на текстуру низкой плотности, которая должна быть отобрана, в результате чего получается усеченный круг. Я не знаю, как решить эту проблему, потому что pменяется каждый кадр, поэтому я не могу просто «испечь» границу между двумя плотностями. Легко предотвратить обратную проблему, создав текстуру высокой плотности из нижней (т. Е. Если круг на текстуре низкой плотности, убедитесь, что он на текстуре высокой плотности).

Мне интересно, есть ли у кого-нибудь способ улучшить мое решение или хотя бы есть другой метод полностью. Здесь ограничение заключается в том, что pон рассчитывается для каждого кадра в режиме реального времени. Другое ограничение связано с текстурой рисунка: рисунок является черно-белым, где черный - это рисунок, а белый - это фон (как в примере круги). Шаблон может быть не только повторяющимися идентичными фигурами, но и любым расположением произвольных черных фигур на белом фоне. (Возможно, шаблон - неправильный выбор слова.)

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

Райан
источник
3
Ваша фактическая текстура также просто черные точки на белом? Если это так, вы можете генерировать текстуру процедурно, например, с помощью выборки диска Пуассона с различными радиусами. В противном случае, если ваша текстура на самом деле является чем-то более непрерывным, можно использовать смешивание (это не будет хорошо работать для четких текстур, таких как ваш пример). Поэтому, если бы вы могли уточнить, как выглядит ваш фактический шаблон / текстура, это может помочь получить более полезные ответы.
Мартин Эндер
1
Пост процесс? Что-то вроде варианта обнаружения краев: запишите расстояние до ближайшего центра точки, затем в пространстве экрана найдите в окрестности каждого пикселя размер любого (близкого к) нулевого значения. Это дает точки на экране, поэтому вам придется писать и связываться с производными УФ, чтобы вернуться к пространству текстур ... Обратите внимание, что у вас все еще есть проблема с непрерывностью - когда граница p high / low перемещается по поверхности, появляются точки и исчезнуть. Если р может быть непрерывным (мягкая граница), вы можете уменьшить / увеличить точки вдоль границы ...
Даниэль М Гессель
1
Другой вариант - заглянуть в тайлы Ван. введение , генетика плитки , драгоценные камни GPU
maogenc
1
Вы смотрели на бомбардировку текстур? http.developer.nvidia.com/GPUGems/gpugems_ch20.html
Миккель Гьоэль
1
Можете ли вы дать представление о диапазоне форм / узоров, которые вам необходимо охватить, и о том, насколько гибким может быть подход? Предложение @ DanielMGessel об изменении радиусов круга вместо их плотности может упростить задачу и обеспечить более плавную анимацию, но пока не ясно, насколько ограничен ваш подход.
Трихоплакс

Ответы:

6

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

Я предполагаю, что у вас есть какой-то способ оценки pв данной точке поверхности (независимо от того, просматривается ли она из текстуры или вычисляется по какой-то функции). Тогда один из способов обеспечения одинакового pзначения для группы текселей состоит в том, чтобы они все смотрели с одной и той же точки.

УФ-лучи этой точки оценки могут быть сохранены в дополнительных каналах текстуры рисунка. Например, у вас могут быть красный и зеленый каналы, в которых хранятся координаты ультрафиолетового излучения для оценки p, синий канал - пороговое значение для включения этого элемента шаблона, а в альфа-канале - уровень сглаженного серого для отображаемого шаблона. Данные порогового значения УФ + также могут быть в отдельной вторичной текстуре, если это необходимо.

Чтобы сгенерировать эту пороговую текстуру UV +, начиная с текстуры входного паттерна, вы можете программно найти связанные компоненты (например, путем поиска черных пикселей и заливки). Установите точку оценки для всех текселей в каждом компоненте в УФ-центре компонента и сгенерируйте случайный порог для него. Затем при рендеринге используйте пиксельный шейдер, который сначала сэмплирует эту текстуру, затем смотрит pна заданную точку оценки и сравнивает ее с заданным порогом.

Таким образом, каждая фигура шаблона будет видеть одинаковое pзначение и порог и будет либо включаться, либо полностью выключаться. По мере pувеличения, все больше форм преодолеет свой порог и появятся, создавая впечатление постоянно изменяющейся плотности.

Натан Рид
источник
1
Мне очень нравится эта идея, мне придется попробовать ее. Это имеет смысл. Спасибо!
Райан
0

Другая мысль в том же духе. Если у вас есть определенный набор точек, определенный на плоскости, и функция отображения от плоскости к целевой поверхности, то функция плотности на поверхности - это то, как области отображаются от плоской поверхности к цели. Таким образом, карта, сохраняющая область, приведет к появлению одинаковых точек на цели.

М.Б. Рейнольдс
источник