Я пытаюсь оптимизировать работающий вычислительный шейдер. Его цель — создать изображение: найти подходящий цвет (используя небольшую палитру) и вызвать imageStore(image, ivec2, vec4)
.
- Цвета индексируются в массиве uint в UniformBuffer.
- Один цвет в этом UBO упакован внутри одного uint, как {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)?
imageStore()
? Часто это медленнее и потребляет больше энергии, чем просто запись пикселя из фрагментного шейдера, и часто отключает такие оптимизации, как сжатие кадрового буфера. Не используйте его, если вам действительно это не нужно; для таких простых случаев, как этот, фрагментные шейдеры почти всегда являются лучшим решением. - person solidpixel   schedule 02.05.2019