Могу ли я поставить R8G8B8A8 в UBO и использовать его как vec4? - PullRequest
1 голос
/ 02 мая 2019

Я пытаюсь оптимизировать работающий вычислительный шейдер.Его цель - создать изображение: найти подходящий цвет (используя небольшую палитру) и вызвать imageStore(image, ivec2, vec4).

  • . Индексация цветов в массиве uint выполняется в UniformBuffer.
  • Один цвет в этом UBO упакован в одну единицу, как {0-255, 0-255, 0-255, 0-255}.

Здесь код:

struct Entry
{
    *some other data*
    uint rgb;
};

layout(binding = 0) uniform SConfiguration
{
    Entry materials[MATERIAL_COUNT];
} configuration;

void main()
{
    Entry material = configuration.materials[currentMaterialId];

    float r = (material.rgb >> 16) / 255.;
    float g = ((material.rgb & G_MASK) >> 8) / 255.;
    float b = (material.rgb & B_MASK) / 255.;

    imageStore(outImage, ivec2(gl_GlobalInvocationID.xy), vec4(r, g, b, 0.0));
}

Я бы хотел немного очистить / оптимизировать, потому что это преобразование цветов выглядит плохо / бесполезно в шейдере (и должно быть предварительно вычислено).Мой вопрос:

  • Можно ли напрямую упаковать vec4(r, g, b, 0.0) внутри UBO, используя 4 байта (как R8G8B8A8)?

Ответы [ 2 ]

4 голосов
/ 02 мая 2019

Возможно ли сделать это напрямую?Нет.

Но GLSL имеет ряд функций для упаковки / распаковки нормализованных значений.В вашем случае вы можете передать значение как один uint uniform, а затем использовать unpackUnorm4x8 для преобразования его в vec4.Таким образом, ваш код становится:

    vec4 color = unpackUnorm4x8(material.rgb);

Это, конечно, компромисс между памятью и производительностью.Поэтому, если память не является проблемой, вам, вероятно, следует просто передать vec4 ( никогда не использовать vec3) напрямую.

0 голосов
/ 02 мая 2019

Можно ли напрямую упаковать vec4 (r, g, b, 0.0) внутри UBO, используя 4 байта (как R8G8B8A8)?

Невозможновыразить это непосредственно как 4 однобайтовых значения;в шейдере нет соответствующего типа данных, который позволял бы вам объявлять его как тип байта.

Однако, почему, по вашему мнению, вам это нужно?Просто загрузите его как 4 поплавка - это униформа, поэтому вы не будете копировать ее тысячи раз, поэтому дополнительный размер вряд ли станет проблемой на практике.

...