3

我正在使用 SOIL 生成 OpenGL 纹理。一切都很好,除了 SOIL 中的 mip 地图生成引起的远距离伪影。当我不使用标志时:

SOIL_FLAG_MIPMAPS

它不是人工制品,但看起来很糟糕。有人见过这样的文物吗?在水面上,有栗色,在沙滩上,它看起来像浅绿色/蓝色失真。

这是它的样子:

在此处输入图像描述

4

2 回答 2

3

我的猜测是,无论你用来生成 mipmap 的东西都有一个错误,并且没有正确过滤 mip 级别——要么从存储先前级别像素的“有效”区域之外“泄漏”随机颜色,要么忘记计算值对于一些像素。即有一个错误只影响mipmap 链的最后一级。

要验证这是否是原因,请从您加载的纹理的 mip 级别读回数据。使用 glReadPixels 或其他什么。如果最后的 mip 级别包含垃圾 - 这是您的纹理加载例程的错误。您还可以使用 GL_LINEAR_MIPMAP_NEAREST 过滤器并查看是否存在带有紫色像素的特定 mip 级别。

要绕过该问题,请为第一级生成图像并使用glGenerateMipmaps(OpenGL 3+)、glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);(OpenGL 2+ 或 OpenGL 1.4+ - 我忘记它是在哪个版本中添加的。在 OpenGL 3+ 中已弃用)或 gluBuild2DMipMap(古老的 OpenGL 版本) )。

或者您可以自己计算 mipmap。盒式过滤器不难实现。高斯也不难。

如果您使用公式生成纹理(因为您说“生成”),另一种可能的情况是公式会导致最后一个 mip 级别的计算错误,从而导致出现垃圾颜色。

另一种可能的情况是有故障的硬件(你不会相信在过热的 GPU 和损坏的冷却器上可以得到什么样的图片)或有故障的驱动程序。但这应该会在许多应用程序中导致伪影,而不仅仅是在您的程序中。

于 2012-02-14T00:09:31.663 回答
0

各向异性过滤可能会有所帮助:

// right after you set your GL_TEXTURE_MIN/MAG_FILTER
if( glewIsSupported("GL_EXT_texture_filter_anisotropic") )
{
    GLfloat max;
    glGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max );
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, max);
}

或者,某种加载/纹理坐标错误,尽管没有足够的信息可以确定(即,一个完整的、最小的程序来演示该问题)。

于 2012-01-31T20:20:52.477 回答