почему glReadPixel GL_RGB от PBO получил ошибку 0x502 INVALD OPTION

я видел

format определяет формат возвращаемых значений пикселей; принятые значения:

GL_ALPHA GL_RGB GL_RGBA Цветовые компоненты RGBA считываются из цветового буфера. Каждый цветовой компонент преобразуется в число с плавающей запятой, так что нулевая интенсивность отображается в 0,0, а полная интенсивность — в 1,0.

Затем ненужные данные удаляются. Например, GL_ALPHA отбрасывает красный, зеленый и синий компоненты, а GL_RGB отбрасывает только альфа-компонент. GL_LUMINANCE вычисляет однокомпонентное значение как сумму красной, зеленой и синей составляющих, а GL_LUMINANCE_ALPHA делает то же самое, сохраняя альфу в качестве второго значения. Окончательные значения фиксируются в диапазоне [0, 1]."

на https://www.khronos.org/opengles/sdk/1.1/docs/man/glReadPixels.xml

Это хорошо работает, если использовать GL_RGBA. Но если я изменюсь

glReadPixelsPBOJNI(0, 0, ширина, высота, GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, 0);

to

glReadPixelsPBOJNI(0, 0, ширина, высота, GLES30.GL_RGB, GLES30.GL_UNSIGNED_BYTE, 0);

0x502 получен. Что не так с этим?

Мой код находится здесь: https://stackoverflow.com/questions/34347835/how-can-i-implement-pbopixel-buffer-object-in-android-grafika-project


person flyuuo    schedule 30.12.2015    source источник


Ответы (1)


GL_RGB обычно не поддерживается в качестве формата glReadPixels() в OpenGL ES. Из спецификации ES 3.0:

В большинстве случаев допустимы только две комбинации формата и типа. Первый зависит от формата текущей связанной поверхности рендеринга. Для нормализованных поверхностей визуализации с фиксированной точкой допускается сочетание формата RGBA и типа UNSIGNED_BYTE. [..]

Второй формат выбирается реализацией из тех, что определены в таблице 3.2, за исключением форматов DEPTH_COMPONENT и DEPTH_STENCIL. Значения формата и типа для этого формата можно определить, вызвав GetIntegerv с символическими константами IMPLEMENTATION_COLOR_READ_FORMAT и IMPLEMENTATION_COLOR_READ_TYPE соответственно.

Поэтому, если вы не запросите формат, выбранный реализацией, и он вернется как GL_RGB, вы не сможете использовать GL_RGB. Единственный формат, который вы можете использовать везде, это GL_RGBA.

Цитата из найденной вами справочной страницы выглядит как простая ошибка. Если вы посмотрите вверху, где перечислены аргументы, вы увидите, что GL_RGB не указан как допустимый в разделе format. Таким образом, информация на этой странице явно противоречива. Ошибки на справочных страницах распространены. В случае сомнений вы должны проверить технические документы для получения более убедительной информации.

person Reto Koradi    schedule 02.01.2016