Чтение байтов текстуры с помощью 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 
  • Сохранение CMSampleBufferRef из камеры
  • Композиция UIViews с фрагментарным шейдером
  • Как визуализировать множество узлов SpriteKit сразу?
  • SpriteKit падает на iOS10 / Sierra
  • Как я могу обрезать изображение с помощью маски и объединить его с другим изображением (фоном) на iPhone? (Предпочтительнее OpenGL ES 1.1)
  • glDrawArrays выделяет память на каждом кадре
  • Как я могу манипулировать объектами независимо друг от друга в OpenGL ES 2.0?
  • Рендеринг текстур на iOS OpenGL ES-работает на симуляторе, но не на устройстве
  • iOS для рисования пикселей в UIView
  • На iOS, как можно добиться гладкой анимации?
  • Почему необходимо преобразовать m34 преобразователя CALayer перед применением преобразования поворота?
  • Interesting Posts

    Контейнерное добавление

    Google Maps iOS Disable Rotation & Tilt

    Аутентификация паролей в приложении iPhone

    EKEventstore и уникальный идентификатор календаря

    Как изменить цвет шрифта UISearchBar и цвет оттенка изображения?

    Нарисуйте изображения, равномерно распределенные по пути в iOS

    Ускорить первую анимацию UIImageView (принудительно кэшировать изображения)

    UIImageView Animation слишком много потребления памяти

    Как изменить пространство между UIBarButtonItems в UINavigationBar?

    Могу ли я теперь использовать JIT для приложения iOS, которое должно быть распространено через магазин?

    iOS Date Picker с днем ​​недели вместо полной даты

    Что делать с SKDownloadStateFailed, кроме предупреждения?

    Определите высоту UILabel для центрирования при использовании adjustFontSizeToFitWidth

    Как сохранить несколько объектов в объекте отношения. Xcode

    NSJSONSerialization терпит неудачу в DBL_MAX

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