2d和立方体映射中的RGB / BGR格式

时间:2014-10-08 10:52:33

标签: android opengl-es-2.0

我有一个使用C ++编写的本机代码的Android应用程序。 我使用OpenGL进行显示,但纹理由Java代码生成为位图。我将位图的原始内存内容传递给函数glTexImage2D(),并发现以下行为:

  • 如果我使用GL_RGB格式,则立方体映射显示正确的颜色,而2d映射显示红色和蓝色交换。
  • 如果我使用GL_BGR_EXT格式,那么它是相反的:2d映射是正确的,并且立方体映射显示错误的颜色。

在这些情况下,相同的内存内容传递给函数glTexImage2D()。 现在看来我必须使用GL_RGB进行立方体映射,但GL_BGR_EXT用于2d映射以获得正确的颜色。

在Linux上运行完全相同的代码(由PangoCairo生成纹理位图),2d和立方体映射之间没有区别,正如预期的那样(我使用GL_RGB并且我有正确的颜色)。

我不了解映射模式之间的这种差异。我尝试了不同的像素格式(RGBA8888和RGB565),结果是一样的。

相应的代码在这里:

  • 用于多维数据集映射:

    static const GLuint GLTargets[] = {
       GL_TEXTURE_CUBE_MAP_POSITIVE_X,
       GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
       GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
       GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
       GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
       GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
    };
    
    for (unsigned i = 0; i < 6; ++i) {
       glTexImage2D(
          GLTargets[i],                       //  target
          0,                                  //  level
          myFormat,                           //  internal format
          myTarget[i]->GetWidth(),            //  width
          myTarget[i]->GetHeight(),           //  height
          0, myFormat, myPixelFormat,         //  border, external format, type
          myTarget[i]->GetPixelData()         //  pixels
       );
    }
    
  • 用于2d映射:

    glTexImage2D(
        GL_TEXTURE_2D, 0,           // target, level
        myFormat,                   // internal format
        myWidth, myHeight, 0,       // width, height, border
        myFormat, myPixelFormat,    // external format, type
        myTarget.GetPixelData()     // pixels
    );
    

这是特定于Android的行为,还是错误,还是我做错了什么?

我在Android 4.2.2的一些不同的三星设备上尝试过它。

提前完成

Gyorgy Kovesdi

0 个答案:

没有答案