Подробности: у меня есть шейдер фрагмента glsl с однородной текстурой "u_MapTexture" с несколькими тысячами цветов (максимум около 10-15 тысяч уникальных значений rgb). У меня также есть текстура однородной палитры («u_paletteTexture») размером 16384 × 1, которую я хочу использовать для индексации цветов на u_MapTexture. Моя проблема в том, что независимо от того, что я пытаюсь математически, я не могу правильно проиндексировать цвета от первой текстуры до текстуры палитры, используя значения RGB переданного цвета. Эми мысли или идеи относительно того, как я могу это сделать?
Не был уверен, размещать ли это здесь, на Gamedev SE или на Math SE.
Изменить: я думаю, что, возможно, я не добавил достаточно информации о проблеме, поэтому вот некоторые подробности.
Моя текущая идея для карты состоит в том, чтобы сохранить проиндексированную палитру цветов провинции и выполнить операцию замены палитры в моем шейдере фрагмента (как та, что описана в этом вопросе SO: Моделирование смены палитры с помощью шейдеров OpenGL (в LibGDX)). Мой шейдер практически полностью скопирован из связанной статьи.
Моя проблема: найти способ однозначно проиндексировать карту провинции (исходная текстура) -> цвета провинции (индексированная текстура палитры).
Сначала я решил, что текстура палитры будет настроена как текстура (255 + 255) × (255 + 255). Это дало бы большому максимальному количеству стран, из которых можно было бы выбирать, чего никогда не достичь на практике.
Я думал, что вы можете получить соответствующий индекс текстуры палитры цвета страны, получив его индекс в текстуре следующим образом: индекс каждой страны был бы расположен в этой палитре текстуры (x, y) -> (r + g ), (g + b)
Я провел несколько примеров цветов с помощью этого простого уравнения и натолкнулся на неприятный сценарий:
RGB (0, 0, 0) -> (0, 0);
RGB (1, 0, 1) -> (1, 1); ?
RGB (1, 3, 2) -> (4, 5);
RGB (0, 1, 0) -> (1, 1); ?
RGB (2, 5, 10) -> (7, 15);
RGB (255, 255, 255) -> (510, 510);
Знаки вопроса обозначены "повторяющимися" цветами в алгоритме, что означает, что они будут неправильно отображаться в один и тот же индекс страны.
Затем я подумал добавить дополнительные параметры и сжать текстуру до одномерного массива.
Например, текстура палитры имела бы размер (r + g + b), (r, g, b).
При этом с ними такие же точки текстуры:
RGB(0, 0, 0) -> (0);
RGB(1, 0, 1) -> (2); ?
RGB(0, 1, 1) -> (2); ?
RGB(1, 3, 2) -> (6); ?
RGB(3, 2, 1) -> (6); ?
RGB(0, 1, 0) -> (1);
RGB(2, 5, 10) -> (17);
RGB(255, 255, 255) -> (1020);
Обостряется проблема рецидива. Я проделал несколько быстрых вычислений в своей голове (и в целом задумался об этом более глубоко) и понял, что независимо от того, сколькими способами я складываю / умножаю цветовые RGB-переменные, одна и та же проблема будет возникать из-за законов математики. Это приводит к актуальной проблеме: как я могу однозначно и процедурно проиндексировать цвета страны в текстуре палитры и получить к ним доступ через мой шейдер? Это кажется наиболее производительным методом, но его реализация ускользает от меня.
Кроме того, для записи, я знаю, что координаты UV и значения цвета являются плавающими, но я использую стандартный формат 0–255, чтобы решить проблему.
TL; DR Мне нужно извлечь уникальный индекс из каждого значения RGB, и это не представляется возможным на основе моих наборов тестов.
По сути, MCVE будет создавать 2D-спрайт и передавать спрайту фрагментный шейдер принятого ответа связанного вопроса SO. Спрайт будет состоять из примерно 10 уникальных значений RGB, однако какая бы система ни использовалась, она должна поддерживать как минимум несколько тысяч различных уникальных цветов. У меня нет стабильного интернет-соединения, иначе я бы загрузил свои тестовые текстуры.
GL_NEAREST
фильтрацию для обеих текстур, поэтому ваши индексы, а также цвета палитры интерполировались с соседями. ИспользуйтеglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
для обеих текстур - person Spektre   schedule 19.06.2018