Войти
ПрограммированиеФорумГрафика

Посчитать среднее геометрическое всех пикселей текстуры на GPU (2 стр)

Страницы: 1 2 3 Следующая »
#15
5:36, 1 сен. 2015

Laynos
> Я просто не совсем понимаю что происходит в подобном случае. Почему идёт
> усреднение?
схема видеокарты считает все пиксели текстуры и находит их среднее значение(вообще на это значение влияют настройки чтения текстуры, то есть сэмплирования), то есть работает аппаратное ускорение а не программа как таковая.


#16
5:41, 1 сен. 2015

Laynos
> Рендер "крупной текстуры" в малую сводится к
> color = texture2D(image, uv); ?
угу  :)

Обычно рендрят в текстуру в 2 раза меньше исходной, и так пока не дойдут до текстуры 1х1.

#17
7:05, 1 сен. 2015

Рукалицо.жпег, короче. Ладно, я ушел  ушел

#18
17:07, 1 сен. 2015

Dimich
> Тобишь, если рендерить в 2-3 прохода до текстуры 32х32 и потом на CPU считать
> среднее, то это будет не совсем честно?

Не совсем честно. Поскольку усреднение в карте идет блоками, размер которых зависит от конкретной видеокарты (точнее от количества коров и буферов в ней). Потому когда тебе советуют "надо сразу в 1х1", то человек просто не представляет себе внутреннее устройство видеокарты.

> Как бы ты поступил, если была бы текстурка width x height (например, 1920х1080)? Речь идёт о реалтаймовом приложении, разумеется

Если тебе надо ТОЧНОСТЬ на уровне каждого пикселя, то на GPU это не просчитать. Точнее можно, если двигаться по ВСЕМ пикселям текстуры, но карта ляжет на таком количестве texture lookup (обращений к текстуре) - ты просто вылезешь за таймаут в 2 секунды.

Зачем тебе это надо? Верни ты текстуру в основную программу и считай на CPU. Будет быстрее. Видокарты просто не предназначены дла обработки больших массивов, они отлично работают там, где можно разложить операцию на паралельные потоки. В твоем же случае надо одним чохом обработать массив в 2 миллиона векторов. Или делай как я сказал - рендерь в текстуры каждый раз в 3 раза меньше предыдущей, до тех пор пока не останется 1 пиксель. Для 1920х1080 первый проход будет 660x660 (желательно сделать ее квадратной), второй - 220х220, третий - 73х73 и т.д. Можно попробовать скакать быстрее, не в 3 раза а скажем 4-5, но тогда точность будет ниже (или наоборот в 1.5-2 раза - точность выше, скорость ниже). Разумеется результат будет в любом случае приближенным, а не математически точным.

#19
18:11, 1 сен. 2015

Блин, san, извини, но как у тебя с такими рассуждениями получаются такие завораживающие картинки? :)

#20
19:25, 1 сен. 2015

san
> Видокарты просто не предназначены дла обработки больших массивов
А пацаны из АМД и нВидии то и не знают, лол

san
> Верни ты текстуру в основную программу и считай на CPU.
И получи чудовищные тормоза или задержку на пустом месте.
Нахрена возвращать из GPU то что потом все равно используется только на GPU?

Последовательное уменьшение до 1х1 на GPU реализуется элементарно и практически бесплатно (по сравнению с другими операциями).


Blew_zc
> Блин, san, извини, но как у тебя с такими рассуждениями получаются такие
> завораживающие картинки? :)
+100500

#21
19:37, 1 сен. 2015

san
> Поскольку усреднение в карте идет блоками, размер которых зависит от конкретной
> видеокарты (точнее от количества коров и буферов в ней). Потому когда тебе
> советуют "надо сразу в 1х1", то человек просто не представляет себе внутреннее
> устройство видеокарты
про блоки согласен, только если надо получить сэмпл больше блока думаю опять включаются блоки, сэмплируя предыдущий результат. Ведь сэмплирование одна из основных операций видеокарты и подобные ситуации однозначно предусмотрены, не знаю в драйверах или аппаратуре или ещё как.

san
> Видокарты просто не предназначены дла обработки больших массивов
Поспорю - подсчёт суммы массива(цветов текстуры) на ура парралеллится на видеокарте(ну если куда или компшадеры  :)  ).

Blew_zc
> Блин, san, извини, но как у тебя с такими рассуждениями получаются такие
> завораживающие картинки? :)
+100500    :)

#22
20:20, 1 сен. 2015

Laynos
>Почему геометрическое? Потому что геометрическое среднее «тяготеет» к более высоким значениям, а значит будут выбираться более яркие пиксели (что нам и нужно, так как нас интересуют имеющиеся на картинке источники света).
> http://habrahabr.ru/post/165669/
Всё-равно как-то неубедительно.
Что значит "«тяготеет» к более высоким значениям" не совсем понятно, и неравенство средних наводит на другие мысли, прямо противоположные.
О чём, собственно, в комментарии к статье и сказано.

Вот здесь http://habrahabr.ru/post/238425/ вполне себе рисуют цепочку уменьшающихся текстур.
Вот здесь, например, подробнее про среднее геометрическое и формулы: https://mynameismjp.wordpress.com/2010/04/30/a-closer-look-at-tone-mapping/ , утверждается, что "geometric mean of luminance" введена собственно в статье Рейнхарда.

#23
20:40, 1 сен. 2015

Собственно, цитата из статьи:

This quantity Изображение is computed by:
Изображение
where Изображение is the “world” luminance for pixel (x, y), Изображение is the total number of pixels in the image and Изображение is a small value to avoid the singularity that occurs if black pixels are present in the image.

#24
20:49, 1 сен. 2015

outcast
> Последовательное уменьшение до 1х1 на GPU реализуется элементарно и практически бесплатно (по сравнению с другими операциями).

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

k119_55524

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

> Поспорю - подсчёт суммы массива(цветов текстуры) на ура парралеллится на видеокарте
Хотел бы посмотреть на шейдер обрабатывающий в реальном времени 2 миллиона чтений из текстуры.

Blew_zc
> Блин, san, извини, но как у тебя с такими рассуждениями получаются такие завораживающие картинки? :)
Что тебе не понравилось в моих рассуждениях? Я вообще-то не теоретизирую а говорю то, что я уже делал на практике. С шейдерами я работаю уже лет 10 как минимум.

#25
21:25, 1 сен. 2015

san
> но если надо подсчитать ТОЧНО, то это не годится
Это еще почему?

> Хотел бы посмотреть на шейдер обрабатывающий в реальном времени 2 миллиона
> чтений из текстуры.
Зачем? Там будет 2х2 = 4 чтения из текстуры. Ну или 4х4 = 16 чтений.

> С шейдерами я работаю уже лет 10 как минимум.
Работать и понимать - разные вещи.
Сборщик телевизора в цехе тоже работает лет 10, но не понимает электронику.

#26
23:49, 1 сен. 2015

Blew_zc
> Это еще почему?
Усреднение в карте идет не линейно.

> Зачем? Там будет 2х2 = 4 чтения из текстуры. Ну или 4х4 = 16 чтений.
Текстура 1920х1080, надо просуммировать ВСЕ пиксели.

> Работать и понимать - разные вещи.
По вашему посту я это уже понял.

#27
0:20, 2 сен. 2015

san
> Собственно я и предложил этот метод, если ты не заметил :) Это действительно
> быстро, но если надо подсчитать ТОЧНО, то это не годится.
С учетом что используются вычисления с плавающей запятой, точно посчитать не получится никак. И нет никакого смысла за это бороться. Важно посчитать с погрешностью не превышающей определенную величину. И это вполне удается последовательным усреднением в большинстве случаев, для такой задачи как у ТСа. Причем точность будет сильно выше чем если передать на CPU в виде массива данных и их суммировать все сразу в регистрах фиксированной разрядности. Так как обычно яркость соседних пикселей отличается незначительно.

san
> Текстура 1920х1080, надо просуммировать ВСЕ пиксели.
Слава богу у нас 2015 год, это не представляет особых сложностей даже на бюджетных мобилах.

#28
1:47, 2 сен. 2015

san
> Потому когда тебе советуют "надо сразу в 1х1", то человек просто не
> представляет себе внутреннее устройство видеокарты.
Я не имел в виду с разбега в 1x1 рендерить, постепенно, в несколько проходов.

#29
6:02, 2 сен. 2015

FordPerfect
> > если надо получить сэмпл больше блока думаю опять включаются блоки, сэмплируя
> > предыдущий результат.
> Не включатся. Нет там стека блоков и промежуточные результаты хранить негде.
Тоесть Вы хотите сказать что дирестикс или опенжл не может натянуть текстуру любого(возможного) размера на 1 пиксел(таргетрендер 1х1)?
Я специально никогда не проверял, но уверен что здесь проблем не будет.

san
> Хотел бы посмотреть на шейдер обрабатывающий в реальном времени 2 миллиона
> чтений из текстуры.
Откройте любую книгу по куде, там алгоритм нахождения суммы массива(читай текстуры) идёт как стандартный пример, прекрасно распаралеленый.
Хотя конечно же аппаратный сэмплинг будет быстрее программного

san
> Хотел бы посмотреть на шейдер обрабатывающий в реальном времени 2 миллиона
> чтений из текстуры.
а ситуация с дефередшедингом? Там постобработка идёт с чтением из нескольких текстур и на всю текстуру сцены целиком? Тамто сэмплов на порядок выше.

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.