2014-11-06 21 views
0

我在OpenGL中使用紋理(在FLTK中使用C++)並使用mipmap。我正在製作一個多平臺項目(Mac中的當前編碼),但我不想在Windows中使用擴展,所以我沒有使用glGenerateMipmap,因此決定手動完成它們。我這樣做,在這個例子中是'地板'和'天花板'。我用下面的代碼來從不同分辨率的圖像的版本OpenGL中的mipmap顏色製品

glGenTextures(1, &ceiling_texture); 
glBindTexture(GL_TEXTURE_2D, ceiling_texture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 8); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, ceiling_width0, ceiling_height0, 0, GL_RGB, GL_FLOAT, ceiling_pixels0); 
glTexImage2D(GL_TEXTURE_2D, 1, GL_RGB, ceiling_width1, ceiling_height1, 0, GL_RGB, GL_FLOAT, ceiling_pixels1); 
glTexImage2D(GL_TEXTURE_2D, 2, GL_RGB, ceiling_width2, ceiling_height2, 0, GL_RGB, GL_FLOAT, ceiling_pixels2); 
glTexImage2D(GL_TEXTURE_2D, 3, GL_RGB, ceiling_width3, ceiling_height3, 0, GL_RGB, GL_FLOAT, ceiling_pixels3); 
glTexImage2D(GL_TEXTURE_2D, 4, GL_RGB, ceiling_width4, ceiling_height4, 0, GL_RGB, GL_FLOAT, ceiling_pixels4); 
glTexImage2D(GL_TEXTURE_2D, 5, GL_RGB, ceiling_width5, ceiling_height5, 0, GL_RGB, GL_FLOAT, ceiling_pixels5); 
glTexImage2D(GL_TEXTURE_2D, 6, GL_RGB, ceiling_width6, ceiling_height6, 0, GL_RGB, GL_FLOAT, ceiling_pixels6); 
glTexImage2D(GL_TEXTURE_2D, 7, GL_RGB, ceiling_width7, ceiling_height7, 0, GL_RGB, GL_FLOAT, ceiling_pixels7); 
glTexImage2D(GL_TEXTURE_2D, 8, GL_RGB, ceiling_width8, ceiling_height8, 0, GL_RGB, GL_FLOAT, ceiling_pixels8); 

加載數據當我使用紋理我使用

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D,ceiling_texture); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
glTexParameteri(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) 

     //draw primitives with texture coordinates 

glDisable(GL_TEXTURE_2D); 

我使用完全相同的代碼和程序爲「地板」。

但是,對於天花板,我在它使用低分辨率mipmap的距離中得到了一種奇怪的顏色僞影(黃色)。 (見圖)

Yellow artefact in ceiling

我生成使用glGetTexImage施加到不同的版本在不同的分辨率,我通過只是在GIMP縮放圖像產生的相同文件的像素的信息。我再次爲地板和天花板做了同樣的事情。

當我使用glGenerateMipmap這沒有發生。

爲什麼我會得到這樣的人造物,我該怎麼辦?

回答

1

Urgh。這是一個令人失望的原因。當我在GIMP中縮放圖像時發現它使用了一些奇怪的平均值,對於最小分辨率圖像(2x2)的角點像素,決定只是得到完全錯誤的藍色成分(低估它)。手動將其強制爲更合理的價值,現在就起作用。