- glDrawPixels с glPixelMap за указване на палитрата и оставяне на OpenGL да направи картографирането на палитрата. Производителността беше ужасяваща (~5 FPS).
Това не е изненада. glDrawPixels не е много бърз като начало и glPixelMap ще направи преобразуването на индекс/палета → RGB на процесора в със сигурност не много оптимизиран кодов път.
- Извършване на картографиране на палитри (индексирано -> BGRX) в софтуера, след което рисуване с помощта на glDrawPixels.
glDrawPixels е една от най-бавните функции в OpenGL. Това има две основни причини: първо, това е кодов пач, който не е много оптимизиран, второ, той записва директно в целевия буфер на кадри, като по този начин принуждава конвейера да се синхронизира всеки път, когато бъде извикан. Освен това на повечето графични процесори той не е подкрепен от никакъв кеш.
Това, което предлагам, е да поставите вашето индексирано изображение в едноканална текстура, напр. GL_R8 (за OpenGL-3 или по-късно) или GL_LUMINANCE8 и вашата палитра в 1D 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