2016-12-13 2 views
4

Так что моя проблема в том, что я пытаюсь загрузить несколько текстур при запуске, а затем сохранить все идентификаторы, чтобы я мог привязать их к их использованию. Теперь я знаю, что идентификаторы хранятся правильно, потому что я могу отлаживать их и видеть как назначение, так и использование, что идентификаторы одинаковы. Для каждой привязки используется последняя текстура, которую я загружаю. Вот мой код:Загрузка OpenGL связывает последнюю загруженную текстуру со всеми значениями textureID

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; 
} 

Вот мое использование этого кода:

if (showTexture) { 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, material.texture); 
} 

Вот моя нагрузка вызов:

green1.texture = TextureLoader::LoadTexture("/Users/hewitt/Desktop/OpenGLImages/face6.bmp",green1, 256, 256); 

А потом я просто использовать:

glTexCoord2f(1.0f,0.0f); 

обратить в зависимости от угла его изменения. И это правильно рисует одну текстуру, она просто повторяет текстуру даже тогда, когда я использую другое число.

Любая помощь очень ценится.

Edit ----------

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

Что значит «тогда я просто использую»? Эта функция сама по себе ничего не делает. Покажите соответствующую часть, которая на самом деле рисует вещи. Я предполагаю, что вы были вверены устаревшим непосредственным API и попытались восстановить текстуру из 'glBegin/glEnd', чего вы не можете сделать. – ybungalobill

+0

@ybungalobill Я добавил изменение. – Hewiiitt

+1

Вы должны действительно проверить результат 'glGetError()'. В вашем случае вы получили бы 'GL_INVALID_OPERATION' для каждой функции, которая разрешается вызывать между' glBegin/glEnd'. – BDL

ответ

4

Вы не можете назвать glEnable или glBindTexture в то время как между glBegin и glEnd. Вы должны привязать свою текстуру до glBegin. Фактически набор функций OpenGL, которые вы можете звонить между glBegin и glEnd, ограничивается теми атрибутами передающих вершин (glVertex, , glTexCoord и т. Д.).

Обратите внимание, что API немедленного режима (то есть glBegin/glEnd и друзья) является устаревшим и устарел более 10 лет. Я предлагаю вам перейти на современный конвейер OpenGL, который поможет вам разобраться во многих вещах.

+0

Большое вам спасибо. Это было такое легкое исправление – Hewiiitt

+0

Также я знаю, но для этой спецификации мы должны сделать это для opengl 1.1. Не спрашивай у меня ни слова. – Hewiiitt

+0

@Hewiiitt Вероятно, какой-то старый код университет держится от того, кто это сделал в первую очередь ... Надеюсь, они изменят его. –

Смежные вопросы