c++ - OpenGL 中的 mipmap 颜色人工制品

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

我对“地板”使用完全相同的代码和过程。

但是,对于天花板,我在使用低分辨率 mipmap 的距离处得到了一个奇怪的颜色人工制品(黄色色调)。 (见图)

Yellow artefact in ceiling

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

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

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

最佳答案

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

关于c++ - OpenGL 中的 mipmap 颜色人工制品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26778199/

相关文章:

java - 为什么我的 uniform 没有在 openGL 中初始化?

android - 用于图标的 Mipmap 可绘制对象

opengl - OpenGL中纹理有多少个mipmap

c++ - 在接口(interface)类中声明抽象信号

c++ - std::round 不是 std on android 的成员

c++ - 为什么在分配有 'new' 的指针上调用 free() 会导致堆损坏?

c++ - integral_constant 和模板参数推导

optimization - 在GLSL中选择cubmap面的快速方法

c++ - 在 Opengl 中使用 glm 旋转

android - 此文件夹配置 ('v26' )是不必要的; 'minSdkVersion'是26,把这个文件夹下的所有资源合并到 'mipmap-anydpi'