Я пытаюсь оптимизировать работающий вычислительный шейдер.Его цель - создать изображение: найти подходящий цвет (используя небольшую палитру) и вызвать 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)?