0

複数のテクスチャを必要とするアニメーション プロジェクトがあります。すべてのテクスチャを表示したいのですが、モデルのテクスチャ カバーは 1 つだけです。オブジェクトのすべての tga ファイルを表示できません。

    GLuint LoadTexture(char *TexName)
  {
TGAImg Img;        // Image loader

  // Load our Texture
   if(Img.Load(TexName)!=IMG_OK)
    return -1;

   glGenTextures(1,textures);            // Allocate space for texture
   glBindTexture(GL_TEXTURE_2D,textures[0]); // Set our Tex handle as current

   // Create the texture
    if(Img.GetBPP()==24)
     glTexImage2D(GL_TEXTURE_2D,0,3,Img.GetWidth(),Img.GetHeight(),0,GL_RGB,GL_UNSIGNED_BYTE,Img.GetImg());
    else if(Img.GetBPP()==32)
     glTexImage2D(GL_TEXTURE_2D,0,4,Img.GetWidth(),Img.GetHeight(),0,GL_RGBA,GL_UNSIGNED_BYTE,Img.GetImg());
    else
     return -1;

   // Specify filtering and edge actions
   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);

   return textures[0];
  }

void Draw()
{
    glEnable(GL_TEXTURE_2D);

    glGenTextures(17,textures);

    for (int i = 0; i<17; i++){
         textures[i] = LoadTexture(textureNames[i   
         glBindTexture(GL_TEXTURE_2D, textures[i]);
    }

    glEnableClientState(GL_VERTEX_ARRAY);                   
    glEnableClientState(GL_NORMAL_ARRAY);
    glVertexPointer(3,GL_FLOAT,0,triangleArr);              
    glNormalPointer(GL_FLOAT, 0, normals);                  
    glDrawArrays(GL_TRIANGLES, 0, TotalConnectedTriangles); 
    glDisableClientState(GL_VERTEX_ARRAY);                  
    glDisableClientState(GL_NORMAL_ARRAY);  
}

void initialize () 
{
    glViewport(0, 0, 500, 500);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0, 1, 0.1, 1000.0);
    glMatrixMode(GL_MODELVIEW);

    glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
    glShadeModel( GL_SMOOTH );
    glEnable( GL_DEPTH_TEST );

    glEnable(GL_TEXTURE_2D);    
    textures[textureIndex] = LoadTexture(textureNames[textureIndex]);   
    glBindTexture(GL_TEXTURE_2D, textures[textureIndex]);

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);


    glEnableClientState(GL_TEXTURE_COORD_ARRAY);    
    glTexCoordPointer(2, GL_FLOAT, 0, textureArr);

}
</code>`enter code here`

obj ファイルを投稿する必要があるかどうかわかりません。

4

2 に答える 2

1

のドキュメントを見てくださいglActiveTexture。ループで呼び出すglBindTextureと、思ったとおりに実行されません。

于 2013-11-03T19:07:56.880 に答える
0

あなたのコードは多くの理由で間違っています:

  1. draw() 関数がレンダリング コールバックである場合、一連のテクスチャを作成し、それらにデータをロードします。一度だけ行う必要があるため、これは間違っています。
  2. LoadTexture() は、新しいテクスチャを作成し、ファイルからデータをロードします。既に 17 個のテクスチャ i 関数を作成しているため、これは間違っています。
  3. 次に、各テクスチャをループでバインドし、最後のテクスチャのみがアクティブになります
  4. 次に、レンダリングする VBO からすべての頂点をダンプします。どこで初期化したかわかりませんが、最後にバインドされたテクスチャのみを使用します。
  5. initialize() で LoadTexture() への別の呼び出しがあります。実際には、すべてのテクスチャを生成してそこにロードする必要があります
于 2013-11-03T20:20:34.973 に答える