最近一直在做倾斜摄影切片成Cesium的3DTiles功能,中间遇到一个小问题,在通过
osg::Image* v_image = const_cast<osg::Image*>(v_texture2d->getImage(0));
v_image->flipVertical();
unsigned char* v_image_data = const_cast<unsigned char*>(v_image->data());
提取出v_image_data存储osgb瓦片的纹理信息,准备进行纹理压缩,我使用stb_image转换成jpg图片后经常发现纹理变成雪花,研究了一下才发现,不同OSGB纹理有的是RGB,有的是RGBA的,只好根据v_image_data的通道数来选择格式咯
unsigned int numChannels = 0;
if (v_image->getPixelFormat() == GL_RGB) {
numChannels = 3; // RGB 图像有 3 个通道
}
else if (v_image->getPixelFormat() == GL_RGBA) {
numChannels = 4; // RGBA 图像有 4 个通道
}
else if (v_image->getPixelFormat() == GL_LUMINANCE) {
numChannels = 1; // LUMINANCE 图像有 1 个通道
}