Получение glReadPixels (ошибка: 1282, описание: b 'недопустимая операция') с использованием PyOpenGL на Raspberry Pi 3 - PullRequest
0 голосов
/ 31 декабря 2018

Я пишу приложение с использованием PyOpenGL (Python 3.5) и получаю ошибку OpenGL.В частности, это ошибка, связанная с glReadPixels (ошибка: 1282, description = b 'недопустимая операция').См. Ниже:

File "/usr/lib/python3/dist-packages/OpenGL/GL/images.py", line 371, in glReadPixels
imageData
File "/usr/lib/python3/dist-packages/OpenGL/error.py", line 232, in glCheckError
baseOperation = baseOperation,
OpenGL.error.GLError: GLError(
    err = 1282,
    description = b'invalid operation',
    baseOperation = glReadPixels,
    cArguments = (
            0,
            0,
            1640,
            1232,
            GL_RGBA,
            GL_UNSIGNED_BYTE,
            array([[[0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0],
    ...,
    [0, 0, 0, 0],
    [0, 0, ...,
    )
)

Я запустил одну и ту же программу с нулевыми проблемами на разных ноутбуках и настольных компьютерах с разными ОС (Mac OSX, OpenSUSE, Arch Linux ...) и недавно портировал ее наRaspberry Pi 3 (работает Raspbian Stretch).Это где проблема произошла.Код запускается ниже ...

glEnableClientState(GL_VERTEX_ARRAY)
glColor4f(1.0, 1.0, 1.0, 1.0)
glLineWidth(4)
self.vbo.bind()
glVertexPointer(3, GL_FLOAT, 0, self.vbo)
vertex_count = int(len(self.all_vertices) / 3)
glDrawArrays(GL_LINES, 0, vertex_count)
self.vbo.unbind()
glDeleteBuffers(1, [self.vbo])
glDeleteBuffers(1, GLuint(self.vbo))

glDisableClientState(GL_VERTEX_ARRAY)

glPopMatrix()
glPopMatrix()
glFlush()

x, y, width, height = glGetIntegerv(GL_VIEWPORT)
glPixelStorei(GL_PACK_ALIGNMENT, 1)
data = glReadPixels(x,
                    y,
                    width,
                    height,
                    GL_RGBA,
                    GL_UNSIGNED_BYTE)

image = Image.frombytes("RGBA", (width, height), data)
image = image.transpose(Image.FLIP_TOP_BOTTOM)
data = None
image.save(output_file, 'PNG')

Я создаю VBO для каждой итерации в отдельной функции:

    self.all_vertices = np.array(self.all_vertices, dtype='float32')

    size = ADT.arrayByteCount(self.all_vertices)

    self.vbo = glvbo.VBO(self.all_vertices,
                         usage=GL_STATIC_DRAW,
                         target=GL_ARRAY_BUFFER,
                         size=size)

Что делает эту ошибку еще более загадочной, так это то, что передвозникает ошибка: он успешно выполнил вышеуказанный код в цикле ~ 25 раз, выдав 25 PNG.Я понятия не имею, почему, но внезапно на 26-й итерации этого цикла возникает ошибка glReadPixels.Сначала я подумал, что, возможно, это проблема с ресурсами Pi, но при проверке с помощью htop все выглядит хорошо.

Буду очень признателен, если кто-нибудь сможет предложить какие-либо предложения!

...