【发布时间】:2012-03-09 12:20:39
【问题描述】:
我正在尝试设置一个简单的函数,这将使我更容易在 OpenGL 中纹理贴图几何图形,但由于某种原因,当我尝试制作天空盒时,我得到的是一个白盒而不是纹理映射几何。我认为有问题的代码如下:
void MapTexture (char *File, int TextNum) {
if (!TextureImage[TextNum]){
TextureImage[TextNum]=auxDIBImageLoad(File);
glGenTextures(1, &texture[TextNum]);
glBindTexture(GL_TEXTURE_2D, texture[TextNum]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[TextNum]->sizeX, TextureImage[TextNum]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[TextNum]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
}
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture[TextNum]);
//glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[TextNum]->sizeX, TextureImage[TextNum]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[TextNum]->data);
//glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
}
我不明白的是,出于某种原因,glBindTexture() 必须介于 glGenTextures() 和 glTexImage2D 之间。如果我把它放在其他任何地方,它会搞砸一切。什么可能导致这个问题?对不起,如果这很简单,我是 openGL 的新手。
下面是我正在谈论的白盒的屏幕截图:
++++++++++++++++++++++++++++++++++ 编辑 +++++++++++++++++++++++++++++++++
在多玩了一些代码之后,我意识到如果我在最后一个glBindTexture() 之后添加glTexImage2D() 和glTexParameteri(),那么所有的纹理都会加载。为什么如果没有这两行,大多数纹理都会加载,但有一些不会加载,为什么我必须为每一帧调用 glTexImage() ,但只为少数纹理?
【问题讨论】:
-
"auxDIBImageLoad" 请永远不要使用
GLaux。如果需要图片加载,有many actually good libraries for it. -
我问这个的原因实际上主要是因为我在尝试加载纹理时得到了这个白框,我认为这可能与函数的顺序有关,但它看来并非如此。还有什么可能导致这个白框出现?
-
我认为这与订单有关,因为如果我要删除
if (!TextureImage[TextNum]),那么纹理会出现,但考虑到每次渲染帧时都会调用MapTexture(),没有if (!TextureImage[TextNum]),内存会像疯了一样泄漏,直到程序崩溃。
标签: c++ opengl texture-mapping