2011-12-01 65 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