Как визуализировать определенный набор данных (не в общем формате RGBA) с openGL? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть набор данных, который составляет 256x256x18 байт (означает 256 по ширине, 256 по высоте и каждый «пиксель» составляет 18 байт).И я хочу отобразить его в обычном RGBA-изображении 256x256.

Я знал, как это сделать в CPU.Кроме того, я научился использовать texture2D для работы с пикселями с обычными изображениями RGBA.

Интересно, можно ли использовать эти данные в качестве специальной «текстуры»?Если да, то как его сохранить и сэмплировать с помощью openGL / glsl?

// edit 20190426

некоторые подробности о рендеринге каждого фрагмента:

здесь структура 18-BYTE "pixel"

struct Element {
    struct Layer layer1;
    struct Layer layer2;
    struct Layer layer3;
    struct Layer layer4;
    uint16 id2;
}

struct Layer {
    uint8 weight;
    uint16 id1;
    uint8 light; //this will not be used
}

Между тем, существует таблица цветов приблизительно 5000 цветов для id1 и таблица приблизительно 30 цветов для id2;

Алгоритм рендерингачто-то вроде этого:

RGBATuple renderElement(Element e) {
    RGBATuple c = colorTable2[e.id2];
    c = mix(colorTable1[e.layer4.id1], c, e.layer4.weight);
    c = mix(colorTable1[e.layer3.id1], c, e.layer3.weight);
    c = mix(colorTable1[e.layer2.id1], c, e.layer2.weight);
    c = mix(colorTable1[e.layer1.id1], c, e.layer1.weight);
    return c;
}

Данные считываются из файла или принимаются из сети. Все Element формируются в виде картинки (2D матрица), они заполняют первую строку от 0 до 0 255,вторая строка от 256 до 511, ... вот и все.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Да, вы можете, но вам нужно использовать нефиксированный формат текстуры, иначе каналы будут фиксироваться до <0.0,1.0> или <0,255> или любого другого интервала, который мешает организации вашего пользовательского формата пикселей ... и да GLSL - это Кстати, но без подробностей о пользовательском формате пикселей мы можем только догадываться, как это реализовать. Взгляните на это:

если вы посмотрите поближе, то увидите, что моя текстура содержит геометрию сцены в векторном виде вместо изображения.

Итак, я вижу здесь 2 варианта:

  1. умножить разрешение текстуры

    , поэтому вы выбираете несколько текселей для каждого фрагмента, чтобы получить сумму до 18 байт. Это требует небольшого изменения координат текстуры в зависимости от того, какую координату вы умножили (выполнимо внутри GLSL). Остерегайтесь, это ограничено максимальным разрешением текстуры, поэтому рекомендуется умножить разрешение по x и y, чтобы иметь возможность соответствовать пределу с более крупными текстурами.

  2. использовать мультитекстурирование

    чтобы у вас было больше текстур, чтобы их тексели суммировались до ваших 18 байт. Это, однако, ограничено количеством текстурных единиц, поэтому вы не можете иметь много текстур для других вещей, если не используется бесконечное текстурирование.

0 голосов
/ 25 апреля 2019

Как вы знаете, процессорный подход заключается в создании функции преобразования пикселей по вашему выбору, которая берет данные в один пиксель (эти 18 байтов) и преобразует их в значение RGBA по вашему вкусу. Затем вы заполняете массив преобразованными значениями RGBA вашего набора данных, а затем передаете этот массив в glTexImage2D.

Если вам нужна более интерактивная визуализация ваших данных вместо простой текстуры, вы можете использовать предыдущий подход несколько раз (с различными функциями преобразования), чтобы создать несколько текстур, каждая из которых содержит несколько каналов ваших данных, а затем отобразить текстуры вам нужно, или даже интерактивно комбинируйте ваши текстуры, используя фрагментированные шейдеры, как вам нужно.

Однако, если вы хотите просто подать OpenGL свой плоский массив данных в виде 2D-текстуры, где каждый пиксель имеет длину 18 пикселей, то я считаю, что вам не повезло. Документация glTexImage2D определяет только форматы данных пикселей, состоящие из 1-4 примитивных типов данных (byte, short, int, float), и ни один из таких форматов не использует 18 байтов на пиксель. Хотя glPixelStore позволяет вам указать пользовательское смещение между строками ваших данных пикселей, вы не можете иметь никакого шага между отдельными пикселями , так что вы все равно будете иметь необходимо предварительно преобразовать ваш массив в ЦП.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...