Я хотел бы выполнить размытие на 3D текстуре в openGL. Поскольку это отделимо, я должен быть в состоянии сделать это в 3 прохода. У меня вопрос, что будет лучшим способом справиться с этим?
В настоящее время у меня есть 3D-текстура и заполнить ее с помощью imageStore. Должен ли я создать еще 2 копии текстуры для размытия или есть способ сделать это, используя одну текстуру?
Я уже использую glCompute для вычисления mip-карты 3D-текстуры, но в этом случае я читаю из текстуры на уровне 0 и записываю в текстуру на следующем уровне, чтобы не было конфликта, в то время как в этом случае мне понадобятся некоторые копия.
Короче говоря, это не может быть сделано за 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-текстуру, сэмплирующую каждый кадр, что намного дешевле, чем непрерывное размытие).