我有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学习资源是固定功能的,所以它也是跨平台的用户。 –