- 特别注意glCompressedTexImage2D中参数ImageSize和Widht,Height必须一一对应,否则会生成失败,对应规则如下表:
2. 直接上源码:
int genETCR11Tex(int vWidth, int vHeight){
int Width = vWidth, Height = vHeight;
GLuint TextureID[1];
glGenTextures(1, TextureID);
unsigned char* pData = new unsigned char[Width*Height];
glBindTexture(GL_TEXTURE_2D, TextureID[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_R11_EAC, Width, Height, 0, (Width / 4) * (Height /4) * 8, pData);
glBindTexture(GL_TEXTURE_2D, 0);
delete pData;
return TextureID[0];
}
int genETCRGBTex(int vWidth, int vHeight){
int Width = vWidth, Height = vHeight;
GLuint TextureID[1];
glGenTextures(1, TextureID);
unsigned char* pData = new unsigned char[Width*Height];
glBindTexture(GL_TEXTURE_2D, TextureID[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, Width, Height, 0, (Width / 4) * (Height / 4) * 8, pData);
glBindTexture(GL_TEXTURE_2D, 0);
delete pData;
return TextureID[0];
}
int genETCRGBATex(int vWidth, int vHeight){
int Width = vWidth, Height = vHeight;
GLuint TextureID[1];
glGenTextures(1, TextureID);
unsigned char* pData = new unsigned char[Width*Height];
glBindTexture(GL_TEXTURE_2D, TextureID[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, Width, Height, 0, Width * Height, pData);
glBindTexture(GL_TEXTURE_2D, 0);
delete pData;
return TextureID[0];
}