zoukankan      html  css  js  c++  java
  • OpenGL ES无法获取贴图数据原因

    最近在做一个项目,要从贴图中获取图像数据,查了很多资料,也琢磨很久,获取到的数据都是0。终于在一次偶然的机会,发现了端倪,成功了。

    不得不说这“一分灵感”真的很重要

    以下是在获取贴图数据时的注意事项:

    1. 所有的OpenGL调用都在同一个线程来完成,否则会出现未知的问题(没试过在不同线程调用)
      1. 多线程本来就比单线程不好操控,除非对自己的逻辑和代码很有信心,否则,会出什么问题真的很难说
    2. 使用FBO提升效率(没试过不用FBO获取)
      1. 读取贴图数据的原理是将贴图与缓存绑定,再读取缓存数据,达到读取贴图数据的目的
    3. glReadPixels仅支持RGBA(至少3.0还不支持其他颜色格式)
      1. 我就是卡在这里,OpenGL还支持RGB,BGR,BGRA等,但是OpenGL ES只支持RGBA

    函数代码:

     1 static void GetPixelsFromTexture(void* texturePtr, void* dataPtr, int width, int width)
     2 {
     3 GLuint gltex = (GLuint)(size_t)(texturePtr);    //TextureID
     4     glBindTexture(GL_TEXTURE_2D, gltex);    //Designated Texture ability
     5 
     6     GLuint offscreen_framebuffer;
     7     glGenFramebuffers(1, &offscreen_framebuffer);    //Create FBO
     8     glBindFramebuffer(GL_FRAMEBUFFER, offscreen_framebuffer);    //Designated FBO ability
     9     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gltex, 0);    //Bind the FBO with Texture
    10     GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    11     if(status != GL_FRAMEBUFFER_COMPLETE) {
    12         LOGI("failed to make complete framebuffer object %x", status);
    13     }
    14 
    15     uint8_t* tempPtr = (uint8_t*)dataPtr;
    16     glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, dataPtr);    //Get pixels from PBO
    17 
    18     glBindTexture(GL_TEXTURE_2D, 0);
    19     glBindFramebuffer(GL_FRAMEBUFFER, 0);
    20 }

    结论由试验所得,如有错误,望指出

  • 相关阅读:
    LC.225. Implement Stack using Queues(using two queues)
    LC.232. Implement Queue using Stacks(use two stacks)
    sort numbers with two stacks(many duplicates)
    LC.154. Find Minimum in Rotated Sorted Array II
    LC.81. Search in Rotated Sorted Array II
    LC.35.Search Insert Position
    前后端分离:(一)
    Redis基本使用(一)
    GIT篇章(二)
    GIT篇章(一)
  • 原文地址:https://www.cnblogs.com/HuangWj/p/5997331.html
Copyright © 2011-2022 走看看