Графика изменилась с 2000 года. Шейдеры - это (в основном) произвольные программы, которые вычисляют значения.То, что эти значения могут иногда интерпретироваться как цвета, не имеет значения.Шейдеры - это программы;они делают то, что вам нужно.
Аналогично, текстуры не содержат цветов, если только ваш шейдер не решит интерпретировать их как цвета.Текстуры - это не что иное, как таблицы поиска значений.Опять же, эти значения могут быть цветами, но не могут.Все зависит от того, как ваш шейдер использует эти значения.
Вы можете создавать текстуры, которые используют целочисленные форматы (в отличие от нормализованных целых).Затем вы можете делать любые битовые манипуляции, которые вам нравятся, в вашем шейдере.Ничто из описанного выше не будет особенно трудным для шейдеров.
В вашем случае текстура, вероятно, будет двухканальным форматом с 8 битами на канал, использующим целочисленные значения без знака.В OpenGL этот формат будет записан GL_RG8UI
: красный / зеленый (название двух каналов), 8 бит на канал и целочисленные значения без знака.OpenGL может называть эти каналы «красными» и «зелеными», но важно то, что ваш шейдер делает с ними, а не то, как они называются.
В Vulkan этот формат записан VK_FORMAT_R8G8_UINT
: два 8-битные каналы беззнаковых целочисленных значений.
Принципиальная проблема, с которой вы столкнетесь, - это не формат изображения и не шейдер.Он эффективно передает данные в графический процессор.
В OpenGL у вас нет выбора, кроме как постоянно передавать данные DMA из памяти, доступной для ЦП, в текстуры, доступные для графического процессора.В Vulkan вам, возможно, не придется делать это.
Реализации Vulkan могут сказать, что линейные текстуры могут храниться в памяти, доступной как для CPU , так и для GPU.Они не обязаны предоставлять это, но многие могут это сделать.В таких реализациях нет необходимости в DMA;GPU может напрямую читать то, что написал CPU.Вам по-прежнему нужно будет выполнять двойную буферизацию таких изображений (чтобы минимизировать синхронизацию GPU / CPU. Вы записываете в одно, когда GPU читает данные предыдущего кадра), но это должно улучшить производительность по сравнению с версией DMA.
Конечно, вам все еще понадобится кодовая дорожка для реализаций, где это невозможно.