将位图数据加载到OpenGL纹理中的问题

问题描述:

不幸的是,我在glBindTexture()中遇到了一些问题。将位图数据加载到OpenGL纹理中的问题

当我尝试将位图图像绑定到我的天空盒时,我只看到一些白色。我用其他数字对它进行了测试,但这也不起作用。我相信问题在于Engine类。

这是我engine.cpp,我在这里加载位图等外贸协会:

#include <windows.h> 
#include <gl/GL.h> 

#include <iostream> 
#include "engine.h" 

unsigned char* Engine::getImageContents(char path[], BITMAPINFOHEADER* bih) { 
    FILE* input; fopen_s(&input, path, "rb"); 

    if (input != NULL) { 
     BITMAPFILEHEADER bfh; 
     fread(&bfh, sizeof(bfh), 1, input); 
     fread(&bih, sizeof(bih), 1, input); 

     unsigned char* data = 
      new unsigned char[bih->biWidth * bih->biHeight * bih->biBitCount/8]; 

     fread(data, sizeof(data), 1, input); 
     fclose(input); 

     return data; 
    } else { 
     return NULL; 
    } 
} 

void Engine::bindTexture(char path[]) { 
    this->bindTexture(this->getTextureId(path)); 
} 

void Engine::bindTexture(unsigned int id) { 
    if (id != this->boundTexture) { 
     glBindTexture(GL_TEXTURE_2D, id); 
     this->boundTexture = id; 
    } 
} 

unsigned int Engine::getTextureId(char path[]) { 
    if (this->textureMap.find(path) != this->textureMap.end()) { 
     return this->textureMap[path]; 
    } else { 
     unsigned int id; glGenTextures(1, &id); 
     BITMAPINFOHEADER bih; 
     unsigned char* data = this->getImageContents(path, &bih); 
     this->setupTexture(data, id, bih.biWidth, bih.biHeight); 
     this->textureMap.insert(std::pair<char*, unsigned int>(path, id)); 
     return id; 
    } 
} 

void Engine::setupTexture(unsigned char* data, unsigned int id, long width, long height) { 
    this->setupTexture(data, id, width, height, false); 
} 

void Engine::setupTexture(unsigned char* data, unsigned int id, long width, long height, bool clamp) { 
    std::cout << height << std::endl; 
    this->bindTexture(id); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, clamp ? GL_CLAMP : GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, clamp ? GL_CLAMP : GL_REPEAT); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_INT, data); 
} 

我使用的类是这样的:

Engine::bindTexture(path); 

任何想法?

+1

你确定图像的类型是'GL_UNSIGNED_INT'而不是'GL_UNSIGNED_BYTE'吗? – rwols 2013-05-06 14:01:53

+0

也不应该在'glBindTexture'之前执行'glActiveTexture(GL_TEXTURE0)'? OpenGL有8个纹理“插槽”。 – rwols 2013-05-06 14:03:50

+0

@rwols我将GL_UNSIGNED_INT更改为GL_UNSIGNED_BYTE,但未成功,未找到glActiveTexture(GL_TEXTURE0)。 – Vision 2013-05-06 14:09:29

我看到几个可能的问题。

  1. 你确定你载荷无压缩的.bmp文件,请bfh.biCompression
  2. 您可以使用GL_RGBA如果bih-> biBitCount == 32时,尽量使用GL_RGB
  3. 尝试使用替代GL_UNSIGNED_BYTE GL_UNSIGNED_INT
  4. 请检查图像的大小,我认为空中包厢它应该像128×128,256×256,512×512,功率为2的即纹理尺寸
  5. 更换
    FREAD(数据的sizeof(数据),1,输入);
    on
    fread(data,1,bih-> biWidth * bih-> biHeight * bih-> biBitCount/8,input);
+0

我忘了说,当我得到biit.biWidth的BITMAPINFOHEADER它返回一个随机值。我已经做了3号。另外我将GL_RGBA更改为GL_RGB – Vision 2013-05-06 14:28:10

+0

,请更改fread(&bih,sizeof(bih),1,input); on fread(&bih,sizeof(BITMAPINFOHEADER),1,input); bih是指针 – 2013-05-06 14:34:47

+0

@ VladislavLitunovsky:不,你仍然在传递一个指针的地址,这会损坏堆栈。看到我的答案是正确的电话。 – 2013-05-06 14:36:46

这是不对的:

fread(&bih, sizeof(bih), 1, input); 

bih已经是一个指针结构。你想:

fread(bih, sizeof *bih, 1, input); 

另外,你真的应该使用bfOffBitsBITMAPFILEHEADER,而不是假设位图位紧跟在BITMAPINFOHEADER。见the MSDN topic describing the format of bitmap files

+0

啊,ol''sizeof(指针)'-while-I-actually-meaning -'sizeof(theByteArray)'陷阱 – rwols 2013-05-06 14:36:56

+2

@rwols:存储数据的地址也是错误的。大小*确实与缓冲区匹配 - 但它们都是错误的。 – 2013-05-06 14:38:11

+0

我不认为这是一个问题,它没有改变。 – Vision 2013-05-06 14:47:25