将位图数据加载到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);
任何想法?
我看到几个可能的问题。
- 你确定你载荷无压缩的.bmp文件,请bfh.biCompression
- 您可以使用GL_RGBA如果bih-> biBitCount == 32时,尽量使用GL_RGB
- 尝试使用替代GL_UNSIGNED_BYTE GL_UNSIGNED_INT 的
- 请检查图像的大小,我认为空中包厢它应该像128×128,256×256,512×512,功率为2的即纹理尺寸
- 更换
FREAD(数据的sizeof(数据),1,输入);
on
fread(data,1,bih-> biWidth * bih-> biHeight * bih-> biBitCount/8,input);
我忘了说,当我得到biit.biWidth的BITMAPINFOHEADER它返回一个随机值。我已经做了3号。另外我将GL_RGBA更改为GL_RGB – Vision 2013-05-06 14:28:10
,请更改fread(&bih,sizeof(bih),1,input); on fread(&bih,sizeof(BITMAPINFOHEADER),1,input); bih是指针 – 2013-05-06 14:34:47
@ VladislavLitunovsky:不,你仍然在传递一个指针的地址,这会损坏堆栈。看到我的答案是正确的电话。 – 2013-05-06 14:36:46
这是不对的:
fread(&bih, sizeof(bih), 1, input);
bih
已经是一个指针结构。你想:
fread(bih, sizeof *bih, 1, input);
另外,你真的应该使用bfOffBits
从BITMAPFILEHEADER
,而不是假设位图位紧跟在BITMAPINFOHEADER
。见the MSDN topic describing the format of bitmap files。
你确定图像的类型是'GL_UNSIGNED_INT'而不是'GL_UNSIGNED_BYTE'吗? – rwols 2013-05-06 14:01:53
也不应该在'glBindTexture'之前执行'glActiveTexture(GL_TEXTURE0)'? OpenGL有8个纹理“插槽”。 – rwols 2013-05-06 14:03:50
@rwols我将GL_UNSIGNED_INT更改为GL_UNSIGNED_BYTE,但未成功,未找到glActiveTexture(GL_TEXTURE0)。 – Vision 2013-05-06 14:09:29