使用SOIL - OpenGL的奇怪的mip map相关问题

时间:2012-01-31 04:53:15

标签: opengl mipmaps soil

我正在使用SOIL生成OpenGL纹理。一切都很好,除了由SOIL中的mip贴图生成引起的远距离文物。当我不使用旗帜时:

SOIL_FLAG_MIPMAPS

它不是神器,但它看起来很糟糕。有没有人见过像这样的文物?在水面上,有一种栗色,在沙滩上,看起来像浅绿色/蓝色。

这是它的样子:

enter image description here

2 个答案:

答案 0 :(得分:3)

我的猜测是,无论你用什么来生成mipmap都有一个bug并且不能正确过滤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获得什么样的图片)或者有缺陷的驱动程序。但这应该会导致许多应用程序中的工件,而不仅仅是在您的程序中。

答案 1 :(得分:0)

Anisotropic filtering可能有所帮助:

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

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