Чтение байтов текстуры с помощью glReadPixels?

Я хочу сбросить необработанные данные текстуры на диск (чтобы прочитать позже), и я не уверен, что glReadPixel будет читать из привязанной в данный момент текстуры.

Как я могу прочитать буфер из моей текстуры?

2 Solutions collect form web for “Чтение байтов текстуры с помощью glReadPixels?”

Функция glReadPixels считывает из фреймбуферов, а не текстур. Чтобы прочитать объект текстуры, вы должны использовать glGetTexImage, но он недоступен в OpenGL ES 🙁

Если вы хотите прочитать буфер из своей текстуры, вы можете связать его с FBO (объект FrameBuffer) и использовать glReadPixels :

//Generate a new FBO. It will contain your texture. glGenFramebuffersOES(1, &offscreen_framebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, offscreen_framebuffer); //Create the texture glGenTextures(1, &my_texture); glBindTexture(GL_TEXTURE_2D, my_texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); //Bind the texture to your FBO glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, my_texture, 0); //Test if everything failed GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES); if(status != GL_FRAMEBUFFER_COMPLETE_OES) { printf("failed to make complete framebuffer object %x", status); } 

Затем вам нужно только позвонить в glReadPixels, если вы хотите читать из своей текстуры:

 //Bind the FBO glBindFramebufferOES(GL_FRAMEBUFFER_OES, offscreen_framebuffer); // set the viewport as the FBO won't be the same dimension as the screen glViewport(0, 0, width, height); GLubyte* pixels = (GLubyte*) malloc(width * height * sizeof(GLubyte) * 4); glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); //Bind your main FBO again glBindFramebufferOES(GL_FRAMEBUFFER_OES, screen_framebuffer); // set the viewport as the FBO won't be the same dimension as the screen glViewport(0, 0, screen_width, screen_height); 

Спасибо за ответ Гергонзале. Я потратил некоторое время этим утром, пытаясь понять, как заставить это работать с 16-битными текстурами, этот фрагмент кода может быть полезен для всех, кто переводит GL_UNSIGNED_SHORT_5_6_5 в GL_UNSIGNED_BYTE

 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tSizeW, tSizeH, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, NULL); GLubyte* pixels = (GLubyte*) malloc(tSizeW * tSizeH * sizeof(GLubyte) * 2); glReadPixels(0, 0, tSizeW, tSizeH, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, pixels); int index = (x*tSizeH + y)*2; unsigned int rgb = pixels[index + 1]*256 + pixels[index + 0]; unsigned int r = rgb; r &= 0xF800; // 1111 1000 0000 0000 r >>= 11; // 0001 1111 r *= (255/31.); // Convert from 31 max to 255 max unsigned int g = rgb; g &= 0x7E0; // 0000 0111 1110 0000 g >>= 5; // 0011 1111 g *= (255/63.); // Convert from 63 max to 255 max unsigned int b = rgb; b &= 0x1F; // 0000 0000 0001 1111 //g >>= 0; // 0001 1111 b *= (255/31.); // Convert from 31 max to 255 max 
  • glReadPixels на iOS с мультисэмплированием
  • Связывание нескольких буферов в OpenGL ES
  • iOS и несколько представлений OpenGL
  • Обновление OpenGL ES Touch Detection (Ray Tracing) для iPad Retina?
  • Оказание нескольких текстур в разных точках на экране без использования точечных спрайтов
  • Как воспроизводить видео без AVPlayer или Movie Player на iOS
  • Захват видео в реальном времени с экрана iPhone и iPad, включая аудио и запись на YouTube, Facebook и т. Д.
  • Артефакты при включении 4x MSAA сглаживания на iPad / iOS
  • iOS записывает аудио и записывает сигналы, такие как голосовые заметки
  • рендеринг приложений OpenGL в фоновом режиме
  • Как оптимизировать рендеринг большой модели в OpenGL ES 1.1?
  • Смешивание с использованием GPUImagePoissonBlendFilter
  • Interesting Posts

    Можно ли очистить отдельный APN от центра уведомлений, поскольку он предназначен для локального уведомления

    Автоматический отбор ячейки представления таблицы после появления подробного представления?

    NSNotification, наблюдаемая выпущенными объектами

    Определить кадры просмотра прокрутки с помощью инструментов

    Как получить Wi-Fi SSID в iOS9 после того, как CaptiveNetwork устарела и требует имя Wifi, уже заблокировано

    Анимация UILabel для роста и сжатия

    Нужно ли мне иметь дело с Audio Units, когда мне нужны специальные звуковые эффекты, или я могу полагаться на службы очереди аудио?

    импорт, сохранение и отображение больших наборов данных с использованием фонового потока

    Xcode 6.1 отличается от раздела «информация о развертывании» для дублированной цели

    В iOS, Gamekitframework быстрее, чем структура multipeerconnectivity при отправке сообщений?

    Objective-C добавляет функциональность ко всем методам объекта

    Приращение `static int` вызывает SIGSEGV SEGV_ACCERR

    Как оживить заголовок раздела коллекции в приложении tvOS?

    Загадочная проблема «прогрессивного замедления» в run loop / drawRect

    Получить начальную точку UIBezierPath

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.