OpenGL не хватает памяти, большой FBO

У меня возникают ошибки памяти при создании большого (2 ^ 13) объекта кадрового буфера в PyOpenGL/PyQt:

    width = 8192
    height = 8192

    self.textureFbo = QtOpenGL.QGLFramebufferObject(width,height)
    self.textureFbo.bind()

    texture = self.bindTexture(QtGui.QPixmap(self.textureFilePath)) # 2^13
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glClear (GL_COLOR_BUFFER_BIT);

    glLoadIdentity()
    glViewport(0, 0, width, height)
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity()
    glOrtho(0, +1, +1, 0, -0.1, 2.0);

    glBegin(GL_POLYGON);
    glTexCoord2d(1.0, 0.0)      
    glVertex3f (0.0, 0.0, 0.0)
    glTexCoord2d(1.0, 1.0)
    glVertex3f (1.0, 0.0, 0.0)
    glTexCoord2d(0.0, 1.0)
    glVertex3f (1.0, 1.0, 0.0)
    glTexCoord2d(0.0, 0.0)
    glVertex3f (0.0, 1.0, 0.0)
    glEnd();

    self.deleteTexture(texture)
    self.textureFbo.release()
    self.textureFboLoaded = True

дает:

OpenGL.error.GLError: GLError(
        err = 1285,
        description = 'out of memory',
        baseOperation = glClear,
        cArguments = (GL_COLOR_BUFFER_BIT,)
)
QGLFramebufferObject: Framebuffer incomplete attachment.
Traceback (most recent call last):
  File "main.py", line 286, in paintGL
    self.loadTextureFBO()
  File "main.py", line 357, in loadTextureFBO
    glEnable(GL_TEXTURE_2D)
  File "C:\Python27\lib\site-packages\OpenGL\error.py", line 208, in glCheckErro
r
    baseOperation = baseOperation,
OpenGL.error.GLError: GLError(
        err = 1285,
        description = 'out of memory',
        baseOperation = glEnable,
        cArguments = (GL_TEXTURE_2D,)
)
QImage: out of memory, returning null image

Однако это прекрасно работает, если я перехожу к текстуре 2 ^ 12 или FBO.

Мне кажется неразумным, что два изображения (FBO+текстура) размером около 132 МБ 268 МБ каждое (4 байта*8192^2) должны занимать 1 ГБ видеопамяти. Что мне не хватает?


person leohutson    schedule 28.04.2011    source источник


Ответы (1)


Во-первых, обратите внимание, что 4 x 8192 ^ 2 — это 268 МБ, а не 132, поэтому мы говорим о половине ГБ для этих двух объектов. Предположительно, есть и другие требования к памяти. Я согласен, это звучит так, как будто у вас не должно быть проблем, но я не знаю, что еще происходит.

person Ernest Friedman-Hill    schedule 28.04.2011
comment
Спасибо за ответ, я только что нашел профилировщик видеокарт под названием GPU-Z, он не показывает использование памяти моего второго графического процессора, только моего первого. Итак, я предполагаю, что моя настройка SLI испорчена, и у меня есть только 1 ГБ видеопамяти. В любом случае, базовое использование видеопамяти до запуска моего скрипта составляет 26 МБ. Я запускаю свой скрипт с максимальным размером буфера кадра, который я могу вычислить после проб и ошибок. ошибка памяти. Странно, возможно, есть верхняя граница размера буфера кадра, отличная от ограничения памяти? - person leohutson; 28.04.2011
comment
В SLI текстуры должны быть загружены на обе карты (как иначе текстурные блоки на обеих картах могут работать эффективно), поэтому вы не можете сложить размеры VRAM вместе. - person Ben Voigt; 28.04.2011
comment
Тем не менее, это имеет большой смысл; пик использования видеопамяти составляет 589 МБ, поэтому кажется странным, что ему не хватает памяти для немного большего буфера кадра. - person leohutson; 28.04.2011
comment
@Leo: Помните, что ваша программа - не единственное, что использует VRAM - возможно, ваша ОС / система Windows и любые другие программы, которые могут быть запущены, также влияют на это. Видеопамять может быть просто фрагментирована, чтобы было достаточно доступной памяти, но не в одном непрерывном фрагменте. - person Drew Hall; 06.05.2011
comment
А, спасибо; вот что это было, несмежная память, я разделил текстуру на четыре отдельных фреймбуфера, и проблема исчезла. - person leohutson; 12.05.2011