glTexImage2D将alpha转换为rgba openGL ES

时间:2014-07-15 16:31:29

标签: c++ opengl-es io

我试图将工作的openGL代码转换为openGL ES。经过一番挖掘,我得出结论,以下功能在ES中不起作用,因为格式和内部格式之间的转换不受支持(即源格式和目标格式需要相同)。最简单的修复方法似乎是将alpha数据转换为rgba,其中r=g=b=0这是openGL之前在表面下所做的事情。我附加的修复似乎不起作用,因为 我不认为我理解缓冲区的格式是如何手动进行转换的。也许我可以调用一个openGL ES函数来为我制作这个副本。不确定它是否重要但文件是TGA文件。

void foo( unsigned char *inBytes,
          unsigned int inWidth, 
          unsigned int inHeight ) {
    int error;

    GLenum internalTexFormat = GL_RGBA;
    GLenum texDataFormat = GL_ALPHA;

    if( myAttemptedFix ) {
            texDataFormat = GL_RGBA;

            unsigned char rgbaBytes[inWidth * inHeight * 4];
            for(int i=0; i < inWidth * inHeight; i++) {
                rgbaBytes[4*i] = 0;
                rgbaBytes[4*i + 1] = 0;
                rgbaBytes[4*i + 2] = 0;
                rgbaBytes[4*i + 3] = inBytes[i];
            }
            inBytes = &rgbaBytes[0];

    }


    glBindTexture( GL_TEXTURE_2D, mTextureID );

    error = glGetError();
    if( error != GL_NO_ERROR ) {        // error
        printf( "Error binding to texture id %d, error = %d\n",
                (int)mTextureID,
                error );
        }    

    glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
    if( mRepeat ) {
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
        }
    else {
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
        }

    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );

    glTexImage2D( GL_TEXTURE_2D, 0,
                  internalTexFormat, inWidth,
                  inHeight, 0,
                  texDataFormat, GL_UNSIGNED_BYTE, inBytes );

    error = glGetError();
    if( error != GL_NO_ERROR ) {        // error
        printf( "Error setting texture data for id %d, error = %d, \"%s\"\n",
                (int)mTextureID, error, glGetString( error ) );
        }
}

编辑:当我运行我的修复程序时,它正确地概述了精灵,但也在底部放了很多垃圾,看起来像盲文:

1 个答案:

答案 0 :(得分:2)

这看起来更像是一个C ++问题。我相信你的数据损坏是由这个(缩短的)代码结构引起的:

if (myAttemptedFix) {
    unsigned char rgbaBytes[inWidth * inHeight * 4];
    inBytes = &rgbaBytes[0];
}

rgbaBytes的范围是if - 声明的主体。因此,在结束括号之后为数组保留的内存变得无效,并且其内容在该点之后变得不确定。但是你将inBytes变量点放在此内存中,并在rgbaBytes超出范围后使用它。

由于inBytes然后指向未预留的内存,因此很可能内存被此点与glTexImage2D()调用之间的代码中的其他变量占用。因此,在inBytes调用消耗glTexImage2D()之前,内容会被删除。

解决此问题的最简单方法是将rgbaBytes声明移到if声明之外:

unsigned char rgbaBytes[inWidth * inHeight * 4];
if (myAttemptedFix) {
    inBytes = &rgbaBytes[0];
}

一旦你想到这一点,你可能想让代码结构变得更好一些,但这至少应该让它起作用。