Суммирование пикселей на CPU и GPU
Почему результаты суммирования пикселей текстуры на CPU и GPU различаются? Точность вещественных чисел, используемых при работе GPU различна на разных картах. Например, R300 использует в пиксельном шейдере FP24. Это, значит, результаты суммы на CPU обычных float (32 бита) и на GPU (24 бита) будут немного отличаться.
Точность и диапазон вещественных чисел.
fp16 = s10e5, максимальная абсолютная величина 2^15, точность 1/210-cur_exp
fp24 = s16e7, максимальная абсолютная величина 2^63, точность 1/216-cur_exp
fp32 = s23e8, максимальная абсолютная величина 2^127, точность 1/223-cur_exp
Как видно, точность не линейна.
Зачем на GPU?
Суммирование пикселей текстуры в большинстве случаев на GPU быстрее, чем на CPU.
Как реализовать?
Достаточно написать простой пиксельный шейдер, который будет брать кроме основного пикселя из текстуры еще некоторую окрестность. Создать рендер таргет меньшего размера (флоат-текстуру). Срендерять квад на который натянута эта текстура, записывая в шейдере значение суммы соседних пикселей. Таким образом в несколько проходов используя серию уменьшающихся рендер таргетов можно свести исходную текстуру к одному пикселю, в котором будет сумма всех пикселей исходной текстуры.
26 февраля 2008 (Обновление: 11 мар 2024)