Вычисление MIP-карт с помощью вычислительных шейдеров, было ли это сделано?

Я вручную генерирую MIP-карты с помощью вычислительных шейдеров, так как я не просто фильтрую, а выполняю некоторые вычисления.

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

Но должен быть более быстрый способ :) вместо чтения уровня 0, записи уровня 1, а затем снова чтения уровня 1, записи уровня 2 и т. д., вероятно, более эффективно, например. прочитать тайл уровня 0, а затем итеративно записать все значения для следующих нескольких уровней в одном и том же диспетчерском вызове. Таким образом, можно было сохранить до половины прочтений.

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

В частности, я реализую алгоритм «тяни-толкай», который сначала вычисляет эти мип-уровни от наибольшего к наименьшему. На втором этапе он уточняет мип-уровни, начиная со второго к наименьшему, используя либо исходный тексель, либо интерполяцию четырех окружающих текселей на грубом мип-уровне. Эффективные схемы вычислений для этого я бы тоже хотел увидеть, но не смог найти в гугле.


person karyon    schedule 30.07.2016    source источник
comment
Но выполнение этого за одну итерацию потребовало бы чтения результирующих данных для вызова соседа и т. д., что превратилось бы в кошмар синхронизации.   -  person derhass    schedule 31.07.2016
comment
@derhass: я представлял себе что-то вроде обработки тайла 64x64 с одной рабочей группой (итеративно, а не одного потока на тексель), а затем записи текселей 32x32 на уровень 1 И в общую память, затем вычисление текселей 16x16 уровня 2 и 8x8 до уровня 3. затем либо выполните еще один диспетчерский вызов, либо выполните его до 1x1, в зависимости от того, что более эффективно. в любом случае, не должно быть никакой синхронизации. для второй фазы (push) рабочие группы будут считывать перекрывающиеся фрагменты данных, но, тем не менее, не должно быть необходимости в какой-либо синхронизации.   -  person karyon    schedule 01.08.2016


Ответы (1)


Я не понимал, что это в основном параллельное сокращение с некоторыми ограничениями. Для параллельного сокращения есть хороший технический документ от NVIDIA с множеством стратегий оптимизации, которые также могут применяться здесь: https://docs.nvidia.com/cuda/samples/6_Advanced/reduction/doc/reduction.pdf

Кроме того, я нашел пример реализации масштабирования с помощью вычислительных шейдеров здесь: https://mynameismjp.wordpress.com/2011/08/10/average-luminance-compute-shader/ хотя он немного устарел, он, например. явно пытался векторизовать инструкции.

person karyon    schedule 12.09.2016