使用SOIL时出现奇怪的mip映射相关问题 - OpenGL

3

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

SOIL_FLAG_MIPMAPS

它看起来不像伪影,但是它看起来很糟糕。是否有人见过这样的伪影?在水面上,有一种深红色,在沙子上,看起来像一种浅绿色/蓝色扭曲。

这就是它的样子:

enter image description here


发布一个完整的、最小化的程序,以展示问题。 - genpfault
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版本)。
或者可以自己计算mipmaps。盒式滤波器不难实现。高斯也不难。
如果你使用公式生成纹理(因为你说“生成”),另一个可能的情况是公式在最后的mip等级上出现计算错误,导致出现垃圾颜色。
另一个可能的情况是硬件故障(你不会相信在过热的GPU上使用损坏的散热器可以得到什么样的图像),或者驱动程序存在错误。但这应该会在许多应用程序中引起伪影,而不仅仅是在你的程序中。

今晚会尝试并回复您。谢谢! - Satchmo Brown

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

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


很遗憾没有产生效果。还是谢谢你。 - Satchmo Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接