- glDrawPixels с glPixelMap, чтобы указать палитру, и позволить OpenGL выполнить сопоставление палитры. Производительность была ужасной (~5 FPS).
Это не сюрприз. glDrawPixels не очень быстр для начала, и glPixelMap будет выполнять преобразование индекса/палитры → RGB на ЦП с явно не очень оптимизированным кодовым путем.
- Выполнение отображения палитры (индексировано -> BGRX) в программном обеспечении, а затем рисование с помощью glDrawPixels.
glDrawPixels — одна из самых медленных функций в OpenGL. У этого есть две основные причины: во-первых, это патч кода, не очень оптимизированный, во-вторых, он записывает непосредственно в целевой буфер кадра, поэтому конвейер синхронизируется каждый раз, когда он вызывается. Кроме того, на большинстве графических процессоров он не поддерживается каким-либо кешем.
Я предлагаю вам поместить индексированное изображение в одноканальную текстуру, например. GL_R8 (для OpenGL-3 или более поздних версий) или GL_LUMINANCE8, а вашу палитру в одномерную текстуру RGB, чтобы индекс, используемый в качестве координаты текстуры, искал цвет. Использование текстуры в качестве LUT совершенно нормально. С этой комбинацией вы используете фрагментный шейдер для преобразования индекса палитры на месте в цвет.
Фрагментный шейдер будет выглядеть так
#version 330
uniform sampler2D image;
uniform sampler1D palette;
in vec2 texcoord;
void main()
{
float index = tex2D(image, texcoord).r * 255.f; // 255 for a 8 bit palette
gl_FragColor = texelFetch(palette, index, 0);
}
person
datenwolf
schedule
21.09.2012
glTexSubImage2D
(иSub
там важно). И, конечно же, Майкл прав насчет использования PBO в своих интересах. НоglDrawPixels
— это, безусловно, самое медленное, что вы можете сделать. - person Christian Rau   schedule 21.09.2012