我正在将手机游戏移植到 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
但得到了相同的结果。没有阿尔法通道。请帮我解决这个问题。我真的被困住了。
谢谢。
细节:
- 我使用了带有标志“-nomips -bc3 -alpha”的 nvcompress 工具版本 2.1.0(并且导致了很多变化但没有成功)。
- 我正在使用 OpenGL ES1 库。
我的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; }