OpenGL с GLUT - ошибки malloc - PullRequest
       361

OpenGL с GLUT - ошибки malloc

2 голосов
/ 30 июля 2011

Я хочу скрести изображение из окна GLUT, которое было визуализировано в OpenGL.В стороне от обратного вызова дисплея я вставил этот код:

display() {
        drawTriangle(); //Renders the image
        if(shouldDisplay) {
            shouldDisplay=0;
            bytes = width*height*3; //Color space is RGB
            buffer = (GLubyte *)malloc(bytes); //buffer is global var for now
                glFinish();
            glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer);

        }
        glutSwapBuffers();
    }

После запуска этого кода malloc начинает давать сбой.Ошибка ENOMEM, ошибка 12. Я недостаточно знаю об операционных системах или GLUT, чтобы понять, почему это происходит.Я только пытаюсь выделить 17К на машине с 3 ГБ.Я использую Windows XP и Visual Studio C ++ 2010 Express.Любая помощь или предложения приветствуются.

Ответы [ 3 ]

2 голосов
/ 30 июля 2011

Этот код пропускает free(buffer) в конце, поэтому с каждым перерисовыванием все больше и больше памяти расходуется до тех пор, пока процесс не исчерпает память и / или адресное пространство (позднее только в 32-битной системе, поскольку 64-битные адресное пространство вряд ли исчерпается небольшими выделениями в разумные сроки).

1 голос
/ 30 июля 2011

Попробуйте glPixelStorei(GL_PACK_ALIGNMENT, 1); перед вызовом glReadPixels.

1 голос
/ 30 июля 2011

Позвольте мне перефразировать этот полукровный ответ. Я думаю, что куча уничтожается, возможно, из-за пропущенного free () и последовательного выделения, возможно, из-за того, что glReadPixels перезаписывает ваш целевой буфер.

Большинство кадровых буферов выровнены по крайней мере на 32 бита / двойного слова, что говорит о том, что, как сказано в комментарии, w * h * 4 байта могут работать только так, как это соответствует внутреннему представлению.

Установка выравнивания в 1 байт (как говорит другой ответ) мне тоже подходит.

...