В данном задании вам предстоит развить свои навыки GPGPU программирования, при желании познакомится с теорией цвета и добавить в ваш рендерер тон-маппинг.
- Скопируйте в эту папку любой рендерер уже рисующий что-то, аналогично предыдущим заданиям. В идеале он должен включать в себя все релевантные предыдущие домашки.
- По возможности прочитайте краткое объяснение того, что такое цветовые пространства, гамма-коррекция и тон-маппинг.
Поменяйте ваш рендерер чтобы он
- использовал картинку формата
B10G11R11_UFLOAT
при рендеринге; - переносил контент этой картинки в
R8G8B8
-бэкбуфер при помощи пиксельного шейдера, просто квантующего диапазон$[0, 1]$ на$256$ значений и ограничивающего значения больше$1$ (нужно ли вообще писать какой-то код чтобы получить такое поведение в шейддере?).
В данном контексте картинку формата B10G11R11_UFLOAT
будем называть HDR-изображением (high dynamic range), бэкбуфер LDR-изображением (low dynamic range), а шейдер переносящий его контент в бэкбуфер будем называть шейдером пост-обработки.
Добавьте в шейдер пост-обработки наивный метод уравнивания гистограмм из раздела 4.3 следующей статьи. Для этого:
- напишите компьют-шейдер который посчитает минимум и максимум уровней освещённости в исходном изображении;
- напишите компьют-шейдер, который посчитает гистограмму плотности распределения логарифмов уровней освещённости пикселей HDR-изображения с
$\approx 100$ уровнями квантизации, распределёнными равномерно от минимума до максимума; - напишите компьют-шейддер, который превратит эту гистограмму в функцию распределения;
- поменяйте шейдер пост-обработки чтобы он применял к яркости пикселя преобразование основанное на функции распределения.
За использование shared memory для накопления локальных результатов в рамках группы тредов полагаются дополнительные баллы. Однако лучше реализовать оба варианта и сравнить профайлером время исполнения, использовать shared memory не всегда быстрее чем не использовать. Если в вашем приложении будет возможность включить/отключить shared memory (например при помощи ImGui) и сравнить результаты, это даст ещё больше баллов.
Подумайте, что в здесь имеется в виду под яркостью. Есть ли у яркости понятное представление в цветовой модели RGB? А в других цветовых моделях? Подсказка: это не максимум из значений каналов.
Прочитайте статью о более продвинутом уравнивании гистограмм и реализуйте описанный в ней метод.
- https://computergraphics.stackexchange.com/a/10318 — неплохое объяснение цветовых пространств "на пальцах"
- https://cds.cern.ch/record/330056/files/SCAN-9707101.pdf — тон-маппинг при помощи уравнивания гистограмм
- https://scholar.google.com/scholar?cluster=3620574908359198509&hl=en&as_sdt=0,5 — более продвинутый метод уравнивания гистограмм