Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / OpenGl из текстуры взять все особые точки и передать их на CPU

OpenGl из текстуры взять все особые точки и передать их на CPU

Страницы: 1 2 Следующая »
MAMOHT-92Постоялецwww15 мая 201816:08#0
Итак, есть шейдер, который прогонятется по текстуре 2k*1k, результат которого черный или белый пиксель.

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

На данный момент текстура полученная после фильтрации тупо считывается на ЦПУ через glReadPixels и прогоняется попиксельно на процессоре, если особая точка, то заносится в std::vector. Это медленно, на это уходит 10-15мс на чтение и примерно 30-40  мс на обработку на ЦПУ, это на хорошем процессоре.

Вопрос, можно ли как-то это ускорить, что-то перенести на ГПУ и текстуру считывать какую-то запакованную?
Решение должно так же и поддерживаться на мобилках в рамках GLES 3.0

Изображение

Правка: 15 мая 2018 16:21

MAMOHT-92Постоялецwww15 мая 201816:15#1
итак, 8 полосок, которые будут всегда 8, ни больше ни меньше. Ширина полоски 2048/8=256 пикселей. И обычно в рамках одной скан линии для одной вертикальной полоски максимум в районе 10-20 особых пикселей.  Это как-то можно использовать.

По факту, кроме как фрагментный шейдер мне мало что доступно? Вопрос как мне и куда записывать позиции этих точек на ГПУ?

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

Правка: 15 мая 2018 16:21

Fantom09Постоялецwww15 мая 201816:19#2
ImageStore/SSBO + Atomic Counter, если совсем влоб
MAMOHT-92Постоялецwww15 мая 201816:23#3
Fantom09
> ImageStore/SSBO + Atomic Counter, если совсем влоб
к сожалению нужна поддержка и на мобилках в рамках GLES 3.0
ArochПостоялецwww15 мая 201816:31#4
MAMOHT-92
> к сожалению нужна поддержка и на мобилках в рамках GLES 3.0
glReadPixels на побилках может быть и по шустрее. А вот обработку можно попробовать ускорить несколькими способами:
1) задача легко параллелится.
2) использовать mip-map уровни, то есть не проверять все пиксели 0 уровня, а начинать с 1-3, и если черный то сразу можно отбросить 4-16 лишних проверок.
MAMOHT-92Постоялецwww15 мая 201816:35#5
Aroch
> использовать mip-map уровни, то есть не проверять все пиксели 0 уровня, а
> начинать с 1-3, и если черный то сразу можно отбросить 4-16 лишних проверок.
mip мап уровни придется самому строить, плюс их надо считывать тоже. Задача параллелится, но можно рассчитывать на сколь, на пару виртуальных потоков? плюс приложение итак многопоточное, даже как-то стремновато его параллелить, особенно на мобилках.
ArochПостоялецwww15 мая 201816:41#6
MAMOHT-92
> mip мап уровни придется самому строить, плюс их надо считывать тоже.
render в текстуру с меньшим разрешением (x2).
MAMOHT-92Постоялецwww15 мая 201816:50#7
Aroch
их же потом на цпу надо будет использовать, а readpixels не дешевый.
nullptrПостоялецwww15 мая 201817:43#8
transform feedback?
MAMOHT-92Постоялецwww15 мая 201817:49#9
nullptr
хм, вопрос, он работает с вершинами и позволяет отдавать вершины, и даже я вижу что вроде он GLES 3.0 поддерживается. У меня текстура 2к*1к. Как я понимаю, мне нужно в геометрическом шейдере создавать вершины глядя в эту текстуру и забирать их через transformfeedback? Но геометрические шейдеры не доступны для iphone.

может можно что-то через ComputeShaders сделать?

Правка: 15 мая 2018 17:53

nullptrПостоялецwww15 мая 201817:54#10
да, и через query запросить число записанных "вершин" для их получения на проце
nullptrПостоялецwww15 мая 201818:00#11
если нет геометрических шейдеров, то можно из вершинного писать в разные буферы, а во фрагментном дискардить ненужные пиксели.. потом через квери запросить сколько фрагментов отрисовалось и тем самым получить число нужных вершин для считывания.. как-то так..

... или в вершинном нельзя в разные буферы писать?

Правка: 15 мая 2018 18:01

DelfigamerПостоялецwww15 мая 201818:01#12
Пробовал собирать данные из нескольких пикселей в один фрагментным шейдером?
MAMOHT-92Постоялецwww15 мая 201818:16#13
Delfigamer
> Пробовал собирать данные из нескольких пикселей в один фрагментным шейдером?
сделать даунсемпл?
MAMOHT-92Постоялецwww15 мая 201818:26#14
итак, есть же вроде vertex texture fetch и наверное инстансинг на мобилках есть, чтобы не все сетку 2048*1024 передавать для чтения, но можно ли это связать с трансформфитбеком? и наверно я даже смогу задать ортографическую проекцию, которая отсекала бы мне ненужные вершины, типа если тексель черный, то z позиция у него большая и уходит за плоскость отсечения. Но вот больно сетка здорова 2млн вершин, можно было бы взять поменьше и заюзать инстансинг, но ведь один хрен много вершин будет отрисовываться. И надо как-то с трансформфитбеком связать это все.

но забирать даже 1/10 от 2кк вершин через фитбек не будет хорошим ударом? это ведь не rgba текстура, а 3 флоат числа.

Правка: 15 мая 2018 18:27

Страницы: 1 2 Следующая »

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр