我有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();
}
在繪製我的不同元素以防止發生這種情況之間應該做些什麼?
兩條評論:1)語言標籤不應該c?這段代碼中沒有太多的C++。 2)我真的希望固定的流水線和其他所有從opengl中移除的東西現在都會死掉並被埋沒。至少我不會指望這些東西在新的硬件和驅動程序上得到非常優化。 – Grizzly
您不能在'TEXTURE_MAG_FILTER'中使用'LINEAR_MIPMAP_LINEAR'。無論如何,這是毫無意義的。 'TEXTURE_MAG_FILTER'用於*放大*:使紋理*比基礎層(mipmap鏈中的最大層)更大*。你不能使用比基礎層大的mipmap,所以你不能使用'TEXTURE_MAG_FILTER'在mipmap之間過濾。這可能不是你的問題,但無論如何你應該知道。 –
@Grizzly:「埋葬了嗎?」你在開玩笑嗎?使用OpenGL的人只會這樣做,因爲他們要麼從1)在線資源學習,這幾乎肯定不是基於着色器的,2)他們使用的是基於OpenGL的舊代碼庫,它也不是基於着色器的或3)他們正在進行跨平臺開發。而且由於如此多的GL學習資源是固定功能的,所以它也是跨平臺的用戶。 –