Вы не можете напрямую рендериться в байтовый массив в OpenGL.
Есть два способа работы с этим. Первый способ является самым простым и не требует уловок контекста, а второй -.
Итак, во-первых, простой способ.
Чтобы OpenGL работал, у вас должно быть окно. Это не означает, что окно должно быть видимым , но вам нужно создать его, чтобы получить действительный контекст OpenGL. Поэтому Шаг 1. Создайте окно и сверните его.
Теперь, чтобы получить корректный рендеринг, пиксели в кадровом буфере должны пройти «тест владения пикселями». При рендеринге в кадровый буфер, который содержит сам экран, пиксели окна, которые фактически не видны на экране, не проходят тест владения пикселями. Поэтому значения этих пикселей не определены, если вы используете glReadPixels.
Однако это относится только к кадровому буферу по умолчанию, связанному с окном. Объекты кадрового буфера всегда проходят проверку владения пикселями. Следовательно, Шаг 2. Создайте объект кадрового буфера и связанные с ним средства визуализации для ваших нужд.
Оттуда все довольно просто. Просто сделайте рендеринг как обычно и сделайте glReadPixels, когда вы хотите получить данные. Объекты пиксельных буферов могут использоваться для асинхронной передачи данных пикселей, если производительность является проблемой. Шаг 3. Визуализация и использование glReadPixels для получения данных.
Второй способ более широкодоступен (для FBO требуется поддержка расширений или OpenGL 3.0), но в большей степени зависит от платформы.
Вместо создания FBO на шаге 2 у вас вместо этого есть Шаг 2: используйте glXCreatePbuffer для создания pbuffer. pbuffer - это объект закадрового рендера, который действует как кадровый буфер по умолчанию. Вы glXMakeContextCurrent говорите OpenGL отображать в pbuffer вместо стандартного кадрового буфера.
Шаги 1 и 3 такие же, как указано выше.