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 个纹理
  3. 然后你在一个循环中绑定每个纹理,只有最后一个会被激活
  4. 然后从要渲染的 VBO 中转储所有顶点。我看不到你在哪里初始化它们,但它们只会使用最后一个绑定的纹理。
  5. 在 initialize() 中有另一个对 LoadTexture() 的调用。实际上应该在那里生成并加载所有纹理
于 2013-11-03T20:20:34.973 回答