2016-12-13 5 views
4

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(); 
+1

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

+0

@ybungalobill Ich habe die Änderung hinzugefügt. – Hewiiitt

+1

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

Antwort

4

Sie können nicht glEnable oder glBindTexture während zwischen glBegin und glEnd nennen. Sie müssen Ihre Textur vor glBegin binden. Tatsächlich ist die Menge der OpenGL-Funktionen, die Sie zwischen glBegin und glEnd aufrufen können, auf diejenigen beschränkt, die Vertex-Attribute übertragen (glVertex, glColor, glTexCoord, etc ...).

Beachten Sie, dass die API für den sofortigen Modus (dh glBegin/ und Freunde) veraltet ist und seit mehr als 10 Jahren nicht mehr verwendet wird. Ich schlage vor, Sie wechseln zur modernen OpenGL-Pipeline, die viele Dinge für Sie erledigen wird.

+0

Vielen Dank. Es war so eine einfache Lösung – Hewiiitt

+0

Auch ja, ich weiß, aber für diese Spezifikation müssen wir es für opengl 1.1 tun. Frag nicht, keine Ahnung. – Hewiiitt

+0

@Hewiiitt Wahrscheinlich gibt es einen alten Code, den die Universität von dem, der sie zuerst gemacht hat, behält ... Hoffentlich werden sie es ändern. –