glReadPixels格式为GL_ALPHA失败

时间:2013-11-18 05:50:05

标签: android opengl-es-2.0 glreadpixels

我想通过freetype库在android游戏上绘制字体。通过库获取字形纹理并上传到FBO,我用它来渲染字符串标签;

当我运行此代码时,它会没问题,我得到例外数据,字体显示确定,

    for (int j = 0; j < height; j ++) {
            glReadPixels ( 0, j, width, 1,
                           GL_RGBA, GL_UNSIGNED_BYTE, data + j*bytesPerRow);
    }

但是在我将格式更改为GL_ALPHA之后,它总是在Android设备上返回0, 和gl错误日志:得到错误:0x500,所以这意味着,我无法通过GL_ALPHA读取像素? 错误的代码为:

    for (int j = 0; j < height; j ++) {
            glReadPixels ( 0, j, width, 1,
                           GL_ALPHA, GL_UNSIGNED_BYTE, data + j*bytesPerRow);
    }

我不知道为什么,有什么帮助吗?

1 个答案:

答案 0 :(得分:2)

OpenGL ES只需要在调用glReadPixels (...).

时支持2种格式/数据类型对
  1. GL_RGBAGL_UNSIGNED_BYTE(您已经知道这一个)
  2. 查询:GL_IMPLEMENTATION_COLOR_READ_FORMATGL_IMPLEMENTATION_COLOR_READ_TYPE
  3. 您遗憾地发现GL_ALPHAGL_UNSIGNED_BYTE 是第二个支持的格式/数据类型对。

    要弄清楚第二个支持的对是什么,请考虑以下代码:

    GLint imp_fmt, imp_type;
    
    glGetIntegerv (GL_IMPLEMENTATION_COLOR_READ_FORMAT, &imp_fmt);
    glGetIntegerv (GL_IMPLEMENTATION_COLOR_READ_TYPE,   &imp_type);
    
    printf ("Supported Color Format/Type: %x/%x\n", imp_fmt, imp_type);
    

    你必须相应地调整代码,因为这是C而你正在使用Java ......但是你明白了。

    考虑到没有单一频道颜色可渲染格式而没有扩展名glReadPixels (...),您的实现没有单一频道格式供GL_EXT_texture_rg使用,这是非常好的。