OpenGL中的mipmap color artefact

时间:2014-11-06 11:20:16

标签: c++ opengl mipmaps

我在OpenGL中使用纹理(使用c ++的FLTK)并使用mipmap。我正在制作一个多平台项目(Mac中的当前编码),但我不想在Windows中使用扩展,因此我没有使用glGenerateMipmap,因此决定手动执行它们。我这样做,在这个例子中是'地板'和'天花板'。我使用以下代码加载来自不同分辨率图像版本的数据

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);

我对'floor'使用完全相同的代码和程序。

然而,对于天花板,我在使用低分辨率mipmap的距离中得到一个奇怪的颜色假象(黄色色调)。 (见图)

Yellow artefact in ceiling

我使用glGetTexImage生成像素信息,应用于不同分辨率的同一文件的不同版本,我只是通过缩放GIMP中的图像生成的。我再次为地板和天花板做了同样的事情。

当我使用glGenerateMipmap时,这没有发生。

为什么我会得到这个人工制品,我该怎么办呢?

2 个答案:

答案 0 :(得分:1)

Urgh。这样一个令人失望的原因。事实证明,当我在GIMP中缩小图像时,它使用了一些奇怪的平均值,对于最小分辨率图像(2x2)的角落像素,决定让蓝色分量完全错误(低估它)。手动强制使用更合理的值,现在就可以了。

答案 1 :(得分:-1)

错误:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);

右:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_LINEAR);