我在 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);
我对“地板”使用完全相同的代码和过程。
但是,对于天花板,我在使用低分辨率 mipmap 的距离处得到了一个奇怪的颜色人工制品(黄色色调)。 (见图)
我使用 glGetTexImage
生成像素信息,应用于不同分辨率的同一文件的不同版本,我只是通过缩放 GIMP 中的图像生成的。我再次对地板和天花板做了同样的处理。
当我使用 glGenerateMipmap
时,这并没有发生。
为什么我会得到这个人工制品,我该怎么办?
最佳答案
呃。多么令人失望的理由。事实证明,当我在 GIMP 中缩小图像时,它使用了一些奇怪的平均,对于最小分辨率图像 (2x2) 的最角落像素,决定让蓝色分量完全错误(低估它)。手动将其强制设置为更合理的值,现在可以使用了。
关于c++ - OpenGL 中的 mipmap 颜色人工制品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26778199/