Лучшей идеей было бы рассматривать память кадрового буфера на видеокарте только для записи. Я думаю, причина в том, что видеопамять оптимизирована для записи со стороны процессора, за счет чтения. (Очевидно, что видеопамять можно быстро считывать со стороны видеокарты - она должна отправлять ее на монитор в режиме реального времени)
Самое быстрое решение будет зависеть от того, что вы пытаетесь сделать (хотите уточнить?).
Ничто не мешает вам хранить свой собственный буфер кадров в основной памяти, затем копировать его в текстуру каждого кадра и отображать его в OpenGL. Я делал это раньше, и это намного быстрее, чем glReadPixels, однако вы теряете возможность считывать результаты других операций рендеринга OpenGL. Используйте это, если все, что вам нужно сделать, это поддерживать покадровое состояние части вашей сцены. Например: создание динамической текстуры, которую нельзя сделать с помощью пиксельного шейдера.
Вы также можете избежать чтения намного меньшего набора данных. Я сделал это, когда играл с нереалистичным рендерингом. Я взял свою сцену, визуализировал ее с разрешением 160x120, прочитал ее обратно в основную память, а затем перерисовал как набор 2D спрайтов.