#include #include #include VK_NAMESPACE_BEGIN namespace { #pragma pack(push,1) struct TGAHeader { uint8 id; uint8 color_map_type; uint8 image_type; // 1 colormap image ,2 true-color,3 grayscale uint16 color_map_first; uint16 color_map_length; uint8 color_map_size; uint16 x_origin; uint16 y_origin; uint16 width; uint16 height; uint8 bit; uint8 image_desc; }; union TGAImageDesc { //不要把此union放到上面的struct中,否则Visual C++会将此union编译成4字节。GCC无此问题 uint8 image_desc; struct { uint alpha_depth:4; uint reserved:1; uint direction:1; //0 lower-left,1 upper left }; }; #pragma pack(pop) void RGB8to565(uint8 *data,uint size) { uint8 *src=data; uint16 *target=(uint16 *)data; for(uint i=0;i>3); ++target; src+=3; } } }//namespace Texture2D *LoadTGATexture(const OSString &filename,Device *device) { uint8 *data; const int64 file_length=filesystem::LoadFileToMemory(filename,(void **)&data); if(file_length<=0) { std::cerr<<"[ERROR] open file<"< failed."<image_type==2) { if(header->bit==24) { RGB8to565(data+sizeof(TGAHeader),header->width*header->height); format=FMT_RGB565; pixels_size=header->width*header->height*2; } else if(header->bit==32) { format=FMT_RGBA8UN; pixels_size=header->width*header->height*4; } } else if(header->image_type==3&&header->bit==8) { format=FMT_R8UN; pixels_size=header->width*header->height; } else { std::cerr<<"[ERROR] Image format error,filename: "<CreateTexture2D(format,data+sizeof(TGAHeader),header->width,header->height,pixels_size); if(tex) { std::cout<<"load image file<"<:<"<width<<"x"<height<<"> to texture ok"<:<"<width<<"x"<height<<"> to texture failed."<