Я создаю эмулятор NES и экспериментирую с идеей разгрузки функциональности (где это необходимо) на GPU. Одна идея, которая поразила меня, - выводить пиксели экрана в буфер в настраиваемом формате таким образом, чтобы кодировать свойства для каждого пикселя, чтобы шейдер мог определять, как их отображать. Это разгрузит довольно много логики / ветвления от одной из самых популярных функций в эмуляторе.
Вот пример того, как может выглядеть кодировка для одного пикселя с использованием 2 байтов на пиксель:
Байт 1 (индексы палитры): bbbb ssss
b
: Индекс палитры пикселей фонаs
: Индекс палитры пикселей спрайта
Байт 2 (свойства пикселя): bbss rgbp
b
: 2-битное значение фонового пикселяs
: 2-битное значение пикселя спрайтаr
: выделить красныйg
: выделить зеленыйb
: выделить синийp
: приоритет пикселей спрайта
Я относительно новичок в написании шейдеров, поэтому мои первые вопросы: возможно ли это вообще? В проведенном мною исследовании выяснилось, что текстуры должны быть в определенном формате, чтобы считывать информацию о цвете из них в каждом пикселе, а мой собственный двухбайтовый «цветовой» формат даже не представляет цвет в и само по себе. Если это возможно, то какой высокоуровневый подход можно использовать для этого? Я планирую использовать vulkan, но любой подход, который применяется в более общем плане (в отношении шейдеров), приветствуется.