我将纹理 ID 存储在 GLuint textures[]
数组中。当我尝试绑定(bind)其中的第一个 (textres[0]) 时,我得到了随机的一个。有时很好,但大多数情况下不是。每个其他的都工作得很好。我还尝试在其他绘图方法中绑定(bind)此纹理,它的行为方式相同。我的加载函数:
int Screen::loadTextures()
{
Images.clear();
Images.append(QImage("APPLE.png"));
Images.append(QImage("V.png"));
Images.append(QImage("TAIL.png"));
Images.append(QImage("DTOR.png"));
Images.append(QImage("HEAD.png"));
Images.append(QImage("BACK.png"));
Images.append((QImage("PLUS10.png")));
Images.append((QImage("SPEEDUP.png")));
for(int i = 0; i<Images.size(); ++i)
{
Images[i] = QGLWidget::convertToGLFormat(Images[i]);
if(Images[i].isNull()) return 0;
}
textures = new GLuint[Images.size()];
glGenTextures(Images.size(), &textures[Images.size()]);
for(int i=0; i<Images.size(); ++i)
{
glBindTexture(GL_TEXTURE_2D,textures[i]);
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, Images[i].width(), Images[i].height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, Images[i].bits());
}
return 1;
}
和绘画:
void Screen::drawApple(int X, int Y)
{
#define JEDNOSTKA = 0.2
glPushMatrix();
glBindTexture(GL_TEXTURE_2D,textures[0]);
glTranslated(X*JEDNOSTKA, Y*JEDNOSTKA,0);
glBegin(GL_POLYGON);
glTexCoord2f(0,1);
glVertex3d(-JEDNOSTKA/2, JEDNOSTKA/2,0);
glTexCoord2f(1,1);
glVertex3d( JEDNOSTKA/2, JEDNOSTKA/2,0);
glTexCoord2f(1,0);
glVertex3d( JEDNOSTKA/2,-JEDNOSTKA/2,0);
glTexCoord2f(0,0);
glVertex3d(-JEDNOSTKA/2,-JEDNOSTKA/2,0);
glEnd();
glPopMatrix();
}
最佳答案
代替
&textures[Images.size()]
实际上传递的是您应该使用的数组之外的第一个 uint 的地址
glGenTextures(Images.size(), textures);
因为 textures 是指向数组第一个元素的 uint 指针。
关于c++ - 如何防止在 OpenGL Qt 中绑定(bind)随机纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25717197/