У вас есть разные варианты.
Вы вызываете ReadPixel , конвейеризованный с потоком рендеринга.В этом случае возвращаемые данные должны храниться в буфере, который может быть помещен в очередь для потока, который предназначен для сохранения изображений.Это можно легко сделать с помощью очереди буфера, мьютекса и семафора: поток рендеринга получает данные, используя ReadPixel , блокирует мьютекс, ставит в очередь (память системы) пиксельный буфер, разблокирует мьютекс, увеличивает семафор;рабочий поток (заблокированный на семафоре) будет сигнализирован потоком рендеринга, заблокирует мьютекс, освободит буфер пикселов, разблокирует мьютекс и сохранит изображение.
В противном случае вы можете скопировать текущий кадровый буфер натекстура или пиксельный буферный объект.В этом случае у вас должно быть два разных потока, каждый из которых имеет текущий контекст OpenGL (через MakeCurrent ) и совместно использует свое пространство объектов друг с другом (как предлагает user771921 ).Когда первый поток рендеринга вызывает ReadPixels (или CopyPixels ), уведомляет второй поток об операции (например, с использованием семафора);второй поток рендеринга отобразит буферный объект пикселя (или получит данные текстуры).Этот метод имеет то преимущество, что позволяет драйверу передавать первую операцию чтения потока, но он фактически удваивает операции копирования памяти, вводя дополнительный вспомогательный буфер.Более того, операция ReadPixel сбрасывается, когда второй поток отображает буфер, который выполняется (наиболее вероятно) сразу после сигнализации второго потока.
Я бы предложил первый вариант, поскольку оннамного чище и проще.Второй вариант слишком сложен, и я сомневаюсь, что вы можете воспользоваться его преимуществами: операция сохранения изображений выполняется намного медленнее, чем ReadPixel .
Даже если ReadPixel не передается по конвейеру, делает ли этоFPS действительно тормозит?Не оптимизируйте, прежде чем вы сможете профилировать.
В приведенном вами примере используются функции GDI, которые не связаны с OpenGL.Я думаю, что код вызовет repaint событие формы и затем захватит содержимое клиентской области окна.Это выглядит намного медленнее по сравнению с ReadPixel , даже если я фактически не выполнял профилирование по этой проблеме.