2011-12-01 82 views
1

我有mipmapping正常工作。但出于某种原因,在应用纹理之后,我的应用程序中的所有其他对象都采用了似乎是纹理平均颜色的东西。即使是HUD。有什么我需要考虑?这里是代码:OpenGL mipmap问题

GLuint LoadTexture(const char * filename, int width, int height) 
{ 
    GLuint texture; 
    unsigned char * data; 
    FILE * file; 

    file = fopen(filename, "rb"); 
    if (file == NULL) return 0; 
    data = (unsigned char *)malloc(width * height * 3); 
    fread(data, width * height * 3, 1, file); 
    fclose(file); 

    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, GL_RGB, GL_UNSIGNED_BYTE, data); 
    free(data); 
    return texture; 
} 

在循环之前被调用并释放后缀。下一部分代码发生在我的while循环中。它在场景中的所有其他对象之前调用。

void makeGround() { 

    glBindTexture(GL_TEXTURE_2D, texture); 

    GLfloat mat_specular[]  = { 0.5, 0.5, 0.5, 1.0 }; 
    GLfloat mat_diffuse[]  = { 0.8, 0.8, 0.8, 1.0 }; 
    GLfloat mat_shininess[]  = { 100.0 }; 

    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); 
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); 
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); 

    //glColor3f(1.0, 1.0, 1.0); 

    glPushMatrix(); 
     glTranslatef(-(size/2), 0.0f, -(size/2)); 
     glCallList(LIST1); 
    glPopMatrix(); 
} 

在绘制我的不同元素以防止发生这种情况之间应该做些什么?

+0

两条评论:1)语言标签不应该c?这段代码中没有太多的C++。 2)我真的希望固定的流水线和其他所有从opengl中移除的东西现在都会死掉并被埋没。至少我不会指望这些东西在新的硬件和驱动程序上得到非常优化。 – Grizzly

+0

您不能在'TEXTURE_MAG_FILTER'中使用'LINEAR_MIPMAP_LINEAR'。无论如何,这是毫无意义的。 'TEXTURE_MAG_FILTER'用于*放大*:使纹理*比基础层(mipmap链中的最大层)更大*。你不能使用比基础层大的mipmap,所以你不能使用'TEXTURE_MAG_FILTER'在mipmap之间过滤。这可能不是你的问题,但无论如何你应该知道。 –

+0

@Grizzly:“埋葬了吗?”你在开玩笑吗?使用OpenGL的人只会这样做,因为他们要么从1)在线资源学习,这几乎肯定不是基于着色器的,2)他们使用的是基于OpenGL的旧代码库,它也不是基于着色器的或3)他们正在进行跨平台开发。而且由于如此多的GL学习资源是固定功能的,所以它也是跨平台的用户。 –

回答

4

我猜想你完成渲染应该纹理化的部分后,你会解散纹理或禁用纹理。当你尝试渲染无纹理的对象时,它们仍然会得到纹理,但由于缺少纹理坐标,它们都使用相同的texcoord,所以它会从纹理中获得一种颜色。

+0

如果我绘制地面,然后在绘制其他任何东西之前禁用2D纹理,它只是保持地板不被纹理。 – grep

+0

因此,如果你在打磨地面后停用纹理处理(并在下次绘制地面之前重新绘制纹理,那么地面是无纹理的?)这看起来有点奇怪,说明你正在做的事情的更多细节(显示你在哪里进行/禁用纹理等) – Grizzly

+0

啊,你知道什么,在某个时候我评论了重新启用。谢谢!这解决了我的问题。 – grep