【问题标题】:How to get texture data using textureID's in openGL如何在openGL中使用textureID获取纹理数据
【发布时间】:2011-07-04 07:27:18
【问题描述】:

我正在编写一些代码,我可以访问的只是一个 textureID 来访问所需的纹理。有什么方法可以访问此纹理的 RGB 值,以便对其执行一些计算?

编辑:我正在寻找 glTexSubImage2D 的倒数。我想获取纹理数据而不是替换它。

【问题讨论】:

    标签: opengl textures


    【解决方案1】:

    您可能正在寻找glGetTexImage

    在使用glGetTexImage 之前,不要忘记将glBindTexture 与您的纹理ID 一起使用。

    【讨论】:

    • 谢谢!这正是我想要的。
    • 如何获得一块纹理(即矩形)?
    • 我认为您必须将其渲染到 FBO,然后使用 glReadPixels 从中读取。
    【解决方案2】:

    在 OpneGL 中,glGetTexImage/glGetnTexImage 可以分别读取函数 glGetTextureImage 的 DSA 版本。

    另一种可能性是将纹理附加到帧缓冲区并通过glReadPixels 读取像素。 OpenGL ES 不提供glGetTexImage,所以这是 OpenGL ES 的方式。
    opengl es 2.0 android c++ glGetTexImage alternative


    如果您将纹理图像传输到Pixel Buffer Object,那么您甚至可以通过Buffer object mapping 访问数据。另见OpenGL Pixel Buffer Object (PBO)
    您必须将具有适当大小的缓冲区绑定到目标GL_PIXEL_PACK_BUFFER

    // create buffer
    GLuint pbo;
    glGenBuffers(1, &pbo);
    glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
    glBufferData(GL_PIXEL_PACK_BUFFER, size_in_bytes, 0, GL_STATIC_READ);
    
    // get texture image
    glBindTexture(GL_TEXTURE_2D, texture_obj);
    glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, (void*)(0));
    
    // map pixel buffer
    void * data_ptr = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
    
    // access the data
    // [...]
    
    glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
    

    【讨论】:

      【解决方案3】:

      我写在这里以防万一有人需要。

      在 4.5+ OpenGL 中,可以通过使用 glGetTextureImage()函数。

      例如为了得到一个 GL_RGB 纹理数据, 我们有 3 个浮点数 R、G、B,每一个都是 4 个字节,所以:

      float* data = new float[texture_height * texture_width * 3];
      glGetTextureImage(textureID, 0, GL_RGB, GL_FLOAT, texture_height * texture_width * 3 * 4, data);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-04
        • 2013-01-24
        • 2012-03-14
        • 2021-05-26
        • 1970-01-01
        • 2012-09-17
        • 1970-01-01
        • 2020-04-03
        相关资源
        最近更新 更多