我试图将工作的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 ) );
}
}
编辑:当我运行我的修复程序时,它正确地概述了精灵,但也在底部放了很多垃圾,看起来像盲文:
答案 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];
}
一旦你想到这一点,你可能想让代码结构变得更好一些,但这至少应该让它起作用。