我正在将移动游戏移植到Android,并希望在OpenGL中使用压缩纹理,就像我在iOS上使用PVR纹理一样。
我已经设法将纹理从PNG转换为DXT并使用Nvidia Tegra 2芯片组在Galaxy Tab 10.1上运行游戏。 但是我的DXT5格式化纹理中没有平滑的alpha。它们看起来像是带有1位alpha的DXT1纹理。
我已经从这里阅读并运行了这些示例: http://software.intel.com/en-us/articles/android-texture-compression
我试过这个非常好的图书馆: https://libregamewiki.org/Simple_OpenGL_Image_Library
但结果相同。没有alpha通道。 请帮我解决这个问题。我真的被卡住了。
感谢。
详细说明:
我的openGL代码:
int width = //...
int height = //...
const unsigned char* textureData = //...
int numMipMaps = //...
int format = //...
GLuint texture = 0;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
int blockSize;
GLuint format;
switch (format) {
case S3TC_DXT1:
format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
blockSize = 8;
break;
case S3TC_DXT3:
format = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
blockSize = 16;
break;
case S3TC_DXT5:
format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
blockSize = 16;
break;
case ATC:
format = GL_ATC_RGBA_EXPLICIT_ALPHA_AMD;
blockSize = 16;
break;
default:
//Error...
break;
}
int offset = 0;
for(int i = 0; i < numMipMaps; i++)
{
int size = ((width + 3) / 4) * ((height + 3) / 4) * blockSize;
glCompressedTexImage2D(GL_TEXTURE_2D, i, format, width, height, 0, size, textureData + offset);
offset += size;
//Scale next level.
width /= 2;
height /= 2;
}
答案 0 :(得分:2)
混合功能设置:
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);