2016-12-13 5 views
4

私の問題は、起動時に複数のテクスチャを読み込み、すべてのIDを保存してそれらを使用するようにバインドできるようにすることです。今私はそれをデバッグすることができ、割り当てと使用法の両方でIDが同じであることがわかるので、IDが正しく格納されていることを知っています。バインディングごとに、ロードする最後のテクスチャが使用されます。ここに私のコードは次のとおりです。ここで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); 

角を変えて描画する。そして、これは1つのテクスチャを正確に描画します。異なる数の文字をバインドしてもテクスチャが繰り返されます。

ご協力いただきまして誠にありがとうございます。 glBeginglEndの間にいる間

編集----------

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

あなたはglEnableglBindTextureを呼び出すことはできません。 glBeginの前にテクスチャをバインドする必要があります。実際、glBeginglEndの間で呼び出せるOpenGL関数のセットは、頂点属性(glVertexglColorglTexCoordなど)を転送するものに限定されています。

即時モードのAPI(glBegin/glEndと友人)は従来のものであり、10年以上使用されなくなりました。私は現代のOpenGLパイプラインに切り替えることをお勧めします。それはあなたのために多くのことを並べ替えます。

+0

ありがとうございました。このような簡単な修正だった – Hewiiitt

+0

また、私は知っているが、この仕様ではopengl 1.1のために行う必要があります。手掛かりではない。 – Hewiiitt

+0

@Hewiiittおそらく誰かがそれをやった人と大学が保持している古いコードでしょう...うまくいけば彼らはそれを変えるでしょう。 –

関連する問題