我正在加载一个tga / bmp文件.这工作正常,但最终结果如下所示:
我想要加载的图像如下所示:
我使用的一些代码:
GLuint texture; const char* filename = "/Users/Admin/Documents/Visual Studio 2013/Projects/OpenGL/OpenGL/image.tga"; unsigned char* data; data = (unsigned char *) malloc(128 * 128 * 3); FILE* f; fopen_s(&f,filename,"rb"); fread(data,128 * 128 * 3,1,f); glGenTextures(1,&texture); glBindTexture(GL_TEXTURE_2D,texture); glTexImage2D(GL_TEXTURE_2D,GL_RGB,128,GL_UNSIGNED_BYTE,data);
有人有什么想法我在做错什么?
解决方法
您可以使用这些加载位图和tga文件
#include <vector> #include <fstream> #ifdef __APPLE__ #include <OpenGL/gl.h> #include <OpenGL/glu.h> #endif #ifdef _WIN32 #include <GL/gl.h> #include <GL/glu.h> #endif typedef union PixelInfo { std::uint32_t Colour; struct { std::uint8_t B,G,R,A; }; } *PPixelInfo; class BMP { private: std::uint32_t width,height; std::uint16_t BitsPerPixel; std::vector<std::uint8_t> Pixels; public: BMP(const char* FilePath); std::vector<std::uint8_t> GetPixels() const {return this->Pixels;} std::uint32_t GetWidth() const {return this->width;} std::uint32_t GetHeight() const {return this->height;} bool HasAlphaChannel() {return BitsPerPixel == 32;} }; BMP::BMP(const char* FilePath) { std::fstream hFile(FilePath,std::ios::in | std::ios::binary); if (!hFile.is_open()) throw std::invalid_argument("Error: File Not Found."); hFile.seekg(0,std::ios::end); std::size_t Length = hFile.tellg(); hFile.seekg(0,std::ios::beg); std::vector<std::uint8_t> FileInfo(Length); hFile.read(reinterpret_cast<char*>(FileInfo.data()),54); if(FileInfo[0] != 'B' && FileInfo[1] != 'M') { hFile.close(); throw std::invalid_argument("Error: Invalid File Format. Bitmap required."); } if (FileInfo[28] != 24 && FileInfo[28] != 32) { hFile.close(); throw std::invalid_argument("Error: Invalid File Format. 24 or 32 bit Image required."); } BitsPerPixel = FileInfo[28]; width = FileInfo[18] + (FileInfo[19] << 8); height = FileInfo[22] + (FileInfo[23] << 8); std::uint32_t PixelsOffset = FileInfo[10] + (FileInfo[11] << 8); std::uint32_t size = ((width * BitsPerPixel + 31) / 32) * 4 * height; Pixels.resize(size); hFile.seekg (PixelsOffset,std::ios::beg); hFile.read(reinterpret_cast<char*>(Pixels.data()),size); hFile.close(); } int main() { BMP info = BMP("C:/Users/....../Desktop/SomeBmp.bmp"); GLuint texture = 0; glGenTextures(1,&texture); glBindTexture(GL_TEXTURE_2D,texture); glTexImage2D(GL_TEXTURE_2D,info.HasAlphaChannel() ? GL_RGBA : GL_RGB,info.GetWidth(),info.HasAlphaChannel() ? GL_BGRA : GL_BGR,info.GetPixels().data()); }
TGA的:
#include <vector> #include <fstream> #ifdef __APPLE__ #include <OpenGL/gl.h> #include <OpenGL/glu.h> #endif #ifdef _WIN32 #include <GL/gl.h> #include <GL/glu.h> #endif typedef union PixelInfo { std::uint32_t Colour; struct { std::uint8_t R,B,A; }; } *PPixelInfo; class Tga { private: std::vector<std::uint8_t> Pixels; bool ImageCompressed; std::uint32_t width,height,size,BitsPerPixel; public: Tga(const char* FilePath); std::vector<std::uint8_t> GetPixels() {return this->Pixels;} std::uint32_t GetWidth() const {return this->width;} std::uint32_t GetHeight() const {return this->height;} bool HasAlphaChannel() {return BitsPerPixel == 32;} }; Tga::Tga(const char* FilePath) { std::fstream hFile(FilePath,std::ios::in | std::ios::binary); if (!hFile.is_open()){throw std::invalid_argument("File Not Found.");} std::uint8_t Header[18] = {0}; std::vector<std::uint8_t> ImageData; static std::uint8_t DeCompressed[12] = {0x0,0x0,0x2,0x0}; static std::uint8_t IsCompressed[12] = {0x0,0xA,0x0}; hFile.read(reinterpret_cast<char*>(&Header),sizeof(Header)); if (!std::memcmp(DeCompressed,&Header,sizeof(DeCompressed))) { BitsPerPixel = Header[16]; width = Header[13] * 256 + Header[12]; height = Header[15] * 256 + Header[14]; size = ((width * BitsPerPixel + 31) / 32) * 4 * height; if ((BitsPerPixel != 24) && (BitsPerPixel != 32)) { hFile.close(); throw std::invalid_argument("Invalid File Format. required: 24 or 32 Bit Image."); } ImageData.resize(size); ImageCompressed = false; hFile.read(reinterpret_cast<char*>(ImageData.data()),size); } else if (!std::memcmp(IsCompressed,sizeof(IsCompressed))) { BitsPerPixel = Header[16]; width = Header[13] * 256 + Header[12]; height = Header[15] * 256 + Header[14]; size = ((width * BitsPerPixel + 31) / 32) * 4 * height; if ((BitsPerPixel != 24) && (BitsPerPixel != 32)) { hFile.close(); throw std::invalid_argument("Invalid File Format. required: 24 or 32 Bit Image."); } PixelInfo Pixel = {0}; int CurrentByte = 0; std::size_t CurrentPixel = 0; ImageCompressed = true; std::uint8_t ChunkHeader = {0}; int BytesPerPixel = (BitsPerPixel / 8); ImageData.resize(width * height * sizeof(PixelInfo)); do { hFile.read(reinterpret_cast<char*>(&ChunkHeader),sizeof(ChunkHeader)); if(ChunkHeader < 128) { ++ChunkHeader; for(int I = 0; I < ChunkHeader; ++I,++CurrentPixel) { hFile.read(reinterpret_cast<char*>(&Pixel),BytesPerPixel); ImageData[CurrentByte++] = Pixel.B; ImageData[CurrentByte++] = Pixel.G; ImageData[CurrentByte++] = Pixel.R; if (BitsPerPixel > 24) ImageData[CurrentByte++] = Pixel.A; } } else { ChunkHeader -= 127; hFile.read(reinterpret_cast<char*>(&Pixel),BytesPerPixel); for(int I = 0; I < ChunkHeader; ++I,++CurrentPixel) { ImageData[CurrentByte++] = Pixel.B; ImageData[CurrentByte++] = Pixel.G; ImageData[CurrentByte++] = Pixel.R; if (BitsPerPixel > 24) ImageData[CurrentByte++] = Pixel.A; } } } while(CurrentPixel < (width * height)); } else { hFile.close(); throw std::invalid_argument("Invalid File Format. required: 24 or 32 Bit TGA File."); } hFile.close(); this->Pixels = ImageData; } int main() { Tga info = Tga("C:/Users/...../Desktop/SomeTGA.tga"); GLuint texture = 0; glGenTextures(1,info.GetPixels().data()); }