我有一个包含以下内容的 Model2D 类:
class Model2D
{
public: //it's private, but I'm shortening it here
unsigned char* bitmapImage;
unsigned int textureID;
int imageWidth, imageHeight;
void Load(char* bitmapFilename);
}
void Model2D::Load(char* bitmapFilename)
{
ifstream readerBMP;
readerBMP.open(bitmapFilename, ios::binary);
//I get the BMP header and fill the width, height
bitmapImage = new GLubyte[imageWidth * imageHeight * 4];
//Loop to read all the info in the BMP and fill the image array, close reader
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWidth, imageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmapImage);
}
void Model2D::Draw()
{
glBegin(GL_QUADS);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glBindTexture(GL_TEXTURE_2D, textureID);
float texScale = 500.0; //this is just so I don't have to resize images
glTexCoord2f(0.0, 0.0); glVertex3f(-(imageWidth / texScale), -(imageHeight / texScale), 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-(imageWidth / texScale), (imageHeight / texScale), 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f((imageWidth / texScale), (imageHeight / texScale), 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f((imageWidth / texScale), -(imageHeight / texScale), 0.0);
}
在我的主循环中,我有:
Model2D spritest;
spritest.LoadFromScript("FirstBMP.bmp");
spritest.Z(-5); spritest.X(-2);
Model2D spritest2;
spritest2.LoadFromScript("SecondBMP.bmp");
spritest2.X(+2); spritest2.Z(-6);
//...
//main loop
spritest.Draw();
spritest2.Draw();
虽然调试似乎工作正常,但位图的地址不同,OpenGL 生成的 textureID 也不同,它们也被正确调用,X、Y 和 Z 位置也正确在调试时,由于某些未知原因,spritest 图像数据被 spritest2 覆盖。 即使我不从 spritest2 调用 Draw(),也会显示图像而不是 spritest。
这可能是什么原因造成的?
最佳答案
glBegin
必须在 Draw
中的纹理绑定(bind)函数之后:
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glBindTexture(GL_TEXTURE_2D, textureID);
glBegin(GL_QUADS);
在 glBindTexture 的文档中它指出:
When a texture is bound to a target, the previous binding for that target is automatically broken.
您还会在 glBegin 的文档中找到它它指出:
Only a subset of GL commands can be used between
glBegin
andglEnd
. The commands areglVertex
,glColor
,glSecondaryColor
,glIndex
,glNormal
,glFogCoord
,glTexCoord
,glMultiTexCoord
,glVertexAttrib
,glEvalCoord
,glEvalPoint
,glArrayElement
,glMaterial
, andglEdgeFlag
. Also, it is acceptable to useglCallList
orglCallLists
to execute display lists that include only the preceding commands. If any other GL command is executed betweenglBegin
andglEnd
, the error flag is set and the command is ignored.
因此,在您的 Draw
函数中,您需要放置 glBindTexture(GL_TEXTURE_2D, textureID);
和 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE , GL_DECAL);
在 glBegin(GL_QUADS)
之前。否则,glBindTexture
什么都不做,因为它在 glBegin
中,因此 SecondBMP.bmp
仍然绑定(bind)到目标 GL_TEXTURE_2D
关于c++ - OpenGL 多纹理加载错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14073775/