Почему glReadPixel GL_RGB из PBO получил ошибку 0x502 НЕПРАВИЛЬНАЯ ОПЦИЯ

Я видел

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

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);

в

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

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

Мой код здесь: https://stackru.com/questions/34347835/how-can-i-implement-pbopixel-buffer-object-in-android-grafika-project

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 как действительный в формате. Таким образом, информация на этой странице явно противоречива. Ошибки в справочных страницах встречаются часто. В случае сомнений, вы должны проверить спецификации документов для получения более убедительной информации.

Другие вопросы по тегам