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 }

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

  • 相关阅读:
    tomcat https 启用8443加证书
    深刻理解Python中的元类metaclass(转)
    为什么数据科学家们选择了Python语言?
    谷歌如何管理世界上最聪明的工程师(转)
    前百度首席科学家张栋:36岁以前做到这8点再谈梦想(转)
    MySQL索引原理及慢查询优化(转)
    地理空间距离计算优化(转)
    Innodb中的事务隔离级别和锁的关系(转)
    关于大型网站技术演进的思考(转)
    应用引擎BAE3.0(转)
  • 原文地址:https://www.cnblogs.com/HuangWj/p/5997331.html
Copyright © 2011-2022 走看看