OpenGL Gaussian Kernel на 3D текстуре

Я хотел бы выполнить размытие на 3D текстуре в openGL. Поскольку это отделимо, я должен быть в состоянии сделать это в 3 прохода. У меня вопрос, что будет лучшим способом справиться с этим?

В настоящее время у меня есть 3D-текстура и заполнить ее с помощью imageStore. Должен ли я создать еще 2 копии текстуры для размытия или есть способ сделать это, используя одну текстуру?

Я уже использую glCompute для вычисления mip-карты 3D-текстуры, но в этом случае я читаю из текстуры на уровне 0 и записываю в текстуру на следующем уровне, чтобы не было конфликта, в то время как в этом случае мне понадобятся некоторые копия.

1

Решение

Короче говоря, это не может быть сделано за 3 прохода, потому что это не 2D-изображение. Даже если ядро ​​отделимо.
Вы должны размывать каждый фрагмент изображения отдельно, что составляет 2 прохода для изображения (если вы используете текстуру 256x256x256, то у вас есть 512 проходов только для размытия по координатам U и V). Вы все еще должны размыть координаты T и U (или T и V: безразлично), которые проходят еще 512 проходов. Вы можете повысить производительность, используя билинейный фильтр и считывать значения между текселями, чтобы сохранить некоторую постоянную стоимость обработки. 3D размытие будет очень дорогим.

Совет по производительности: может быть, вам не нужно размыть всю текстуру, а только ее часть? (видимая часть?)

Проблема, которая такая большое количество проходов, количество взаимодействий между GPU и CPU: drawcalls и настройка FBO, которые являются медленными операциями, которые приводят к зависанию CPU (вероятно, другой API с низкой загрузкой процессора будет быстрее)

Постарайтесь не отделять ядро:

Если у вас маленькое ядро ​​(я думаю, до 5 ^ 3, только профилирование покажет максимальный размер ядра), вероятно, самый быстрый способ — НЕ отделять ядро ​​(вот и все, вы сохраняете много вызовов и привязки FBO и используете все на GPU Fillrate и Bandwith).

Распределить работу по времени:

Не имеет значения, отделено ли ваше ядро ​​или нет. Вместо вычисления Gaussian Blur каждый кадр, вы можете просто вычислять его каждую секунду (возможно, с большим ядром). Затем вы используете в качестве источника «данных непрерывного размытия» интерполяцию предыдущего размытия и следующего размытия (которое представляет собой 2x 3D-текстуру, сэмплирующую каждый кадр, что намного дешевле, чем непрерывное размытие).

0

Другие решения