2016-12-13 12 views
4

그래서 제 문제는 시작시 여러 텍스처를로드하고 모든 ID를 저장하려고 시도하여 모든 ID를 바인딩하여 사용하도록하는 것입니다. 이제 ID를 정확하게 디버깅 할 수 있고 ID가 동일하다는 것을 할당 및 사용법에서 볼 수 있기 때문에 ID가 올바르게 저장되고 있음을 알았습니다. 바인딩 할 때마다 마지막으로로드 한 텍스처를 사용합니다. 여기 OpenGL 로딩은 마지막으로로드 된 텍스처를 모든 textureID에 바인딩합니다.

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

내 부하 호출입니다 : 여기
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; 
} 

이 코드의 내 사용이다 :

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

그리고 난 그냥 사용 : 여기 내 코드입니다

glTexCoord2f(1.0f,0.0f); 

모서리에 따라 그릴 수 있습니다. 그리고 이것은 하나의 텍스처를 정확하게 그립니다. 다른 숫자를 바인딩 할 때에도 텍스처를 반복합니다.

도움을 주시면 대단히 감사하겠습니다.

편집 ----------

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()'의 결과를 확인해야합니다. 귀하의 경우에는'glBegin/glEnd' 사이에 호출 할 수있는 모든 함수에 대해'GL_INVALID_OPERATION'을 얻었을 것입니다. – BDL

답변

4

당신의 glBegin 사이 glEnd 동안 glEnable 또는 glBindTexture를 호출 할 수 없습니다. glBegin보다 먼저 텍스처를 바인딩해야합니다. 실제로 glBeginglEnd 사이에서 호출 할 수있는 OpenGL 함수 세트는 정점 속성 (glVertex, glColor, glTexCoord 등 ...)을 전송하는 OpenGL 함수로 제한됩니다.

직접 모드 API (즉, glBegin/glEnd 및 친구들)는 기존 버전이며 향후 10 년 이상 사용되지 않습니다. 나는 당신이 현대 OpenGL 파이프 라인으로 전환하는 것이 좋습니다, 그것은 당신을 위해 많은 것들을 정렬합니다.

+0

정말 고마워요. 그것은 그처럼 쉬운 수정이었습니다 – Hewiiitt

+0

또한 알 수 있겠지만이 스펙을 위해서는 opengl 1.1에서해야합니다. 단서가 아니라고 묻지 마라. – Hewiiitt

+0

@Hewiiitt 아마도 대학은 처음부터 누구와도 관계가없는 오래된 코드 일 것입니다. 바라건대 그들은 그것을 바꿀 것입니다. –