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