Also mein Problem ist, dass ich versuche, beim Start mehrere Texturen zu laden und dann alle IDs zu speichern, damit ich sie binden kann, um sie zu verwenden. Jetzt weiß ich, dass die IDs korrekt gespeichert werden, weil ich es debuggen kann und sowohl bei der Zuweisung als auch bei der Verwendung sehe, dass die IDs identisch sind. Nur für jede Bindung verwendet es die letzte Textur, die ich lade. Hier ist mein Code:OpenGL loading bindet die zuletzt geladene Textur an alle TexturIDs
GLuint TextureLoader::LoadTexture (const char* fileName,Material& material,int width,int height) {
GLuint textureImage;
FILE* textureFile;
textureFile = fopen(fileName, "rb");
unsigned char* imageData;
if (textureFile == NULL) {
return 0;
}
imageData = (unsigned char*)malloc(width * height * 3);
char header[54];
fread(header,1,54,textureFile);
fread(imageData, width * height * 3, 1, textureFile);
fclose(textureFile);
for (int i = 0; i < width * height; ++i) {
int nextIndex = i * 3;
unsigned char a = imageData[nextIndex];
unsigned char b = imageData[nextIndex+2];
imageData[nextIndex] = b;
imageData[nextIndex+2] = a;
}
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &textureImage);
glBindTexture(GL_TEXTURE_2D, textureImage);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
/*glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height,GL_RGB, GL_UNSIGNED_BYTE, imageData);*/
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, imageData);
glGenerateMipmap(GL_TEXTURE_2D);
free(imageData);
return textureImage;
}
Hier ist meine Verwendung dieses Code:
if (showTexture) {
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, material.texture);
}
Hier ist meine Last Call:
green1.texture = TextureLoader::LoadTexture("/Users/hewitt/Desktop/OpenGLImages/face6.bmp",green1, 256, 256);
Und dann benutze ich nur:
glTexCoord2f(1.0f,0.0f);
zu zeichnen, je nach der Ecke ändert sich. Und das zeichnet die eine Textur richtig, es wiederholt nur die Textur, auch wenn ich eine andere Zahl glBind.
Jede Hilfe wird sehr geschätzt.
bearbeiten ----------
glBegin(mode);
Spatial::Vector3 normal = Mesh::calculateNormal (pointGroup);
glNormal3f(normal.x, normal.y, normal.z);
Material material = mesh.getMaterial();
if (showTexture) {
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, material.texture);
}
int counter = 0;
for (Spatial::Vector3 point : pointGroup) {
if (showTexture == false) {
Material::Colour colour = material.getColour();
glColor3f(colour.red, colour.green, colour.blue);
} else {
if (counter == 0) {
glTexCoord2f(1.0f,0.0f);
} else if (counter == 1) {
glTexCoord2f(1.0f,1.0f);
} else if (counter == 2) {
glTexCoord2f(0.0f,1.0f);
} else if (counter == 3) {
glTexCoord2f(0.0f,0.0f);
}
}
glVertex3f(point.x,point.y,point.z);
counter ++;
}
glEnd();
Was meinst du mit "dann verwende ich einfach"? Diese Funktion allein macht nichts. Zeigen Sie den relevanten Teil, der tatsächlich Dinge zeichnet. Meine Vermutung, dass Sie von der legacy unmittelbaren API geschraubt worden sind und versucht haben, die Textur innerhalb von 'glBegin/glEnd' zu binden, was Sie nicht tun können. – ybungalobill
@ybungalobill Ich habe die Änderung hinzugefügt. – Hewiiitt
Sie sollten das Ergebnis von 'glGetError()' wirklich überprüfen. In Ihrem Fall hätten Sie für jede Funktion, die zwischen 'glBegin/glEnd' aufgerufen werden darf, eine 'GL_INVALID_OPERATION' erhalten. – BDL