gl_FragColor и glReadPixels - PullRequest
       3

gl_FragColor и glReadPixels

5 голосов
/ 01 декабря 2011

Я все еще пытаюсь прочитать пиксели из фрагментного шейдера, и у меня есть несколько вопросов.Я знаю, что gl_FragColor возвращает с vec4, что означает RGBA, 4 канала.После этого я использую glReadPixels, чтобы прочитать FBO и записать его в данные

GLubyte *pixels = new GLubyte[640*480*4];
glReadPixels(0, 0, 640,480, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

Это прекрасно работает, но у него действительно есть проблема со скоростью.Вместо этого я хочу просто читать RGB, поэтому игнорируйте альфа-каналы.Я попробовал:

GLubyte *pixels = new GLubyte[640*480*3];
glReadPixels(0, 0, 640,480, GL_RGB, GL_UNSIGNED_BYTE, pixels);

, и это не сработало.Я думаю, это потому, что gl_FragColor возвращает 4 канала, и, может быть, я должен что-то сделать до этого?На самом деле, поскольку мое возвращенное изображение (gl_FragColor) имеет оттенки серого, я сделал что-то вроде

float gray = 0.5 //or some other values
gl_FragColor = vec4(gray,gray,gray,1.0);

Так есть ли эффективный способ использовать glReadPixels вместо использования метода первых 4 каналов?Любое предложение?Кстати, это код opengl es 2.0.

1 Ответ

4 голосов
/ 01 декабря 2011

Спецификация OpenGL ES 2.0 говорит о том, что существует две допустимые формы вызова:

glReadPixels(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

или

GLint format, type;
glGetIntegerv(IMPLEMENTATION_COLOR_READ_FORMAT, &format);
glGetIntegerv(IMPLEMENTATION_COLOR_READ_TYPE, &type);
glReadPixels(x, y, w, h, format, type, pixels);

Возможные комбинации для format и type: (рис. Из спецификации):

table

И реализация решит, что вам доступно.

Однако вполне вероятно, что если вы создадите поверхность рендеринга соответствующего формата, то именно этот формат вы получите здесь. Посмотрите, можете ли вы изменить свой код для получения кадрового буфера RGB (то есть с 0 битами для альфа-канала). Или, может быть, вы захотите создать для этой цели объект закадрового буфера?

...