我正在使用土壤来生成OpenGL纹理。一切都很好,除了土壤中mip地图生成造成的远处伪影。当我不使用标志时:
SOIL_FLAG_MIPMAPS它不是人工制品,但看起来很糟糕。有没有人见过这样的神器?在水面上,有一种栗色,在沙子上,它看起来像是浅绿色/蓝色的扭曲。
下面是它看起来的样子:

发布于 2012-02-14 08:09:32
我的猜测是,无论你用什么来生成mipmap都有一个bug,并且没有正确过滤mip级别-要么是从存储先前级别的像素的“有效”区域之外“泄漏”随机颜色,要么是忘记计算某些像素的值。也就是说,存在一个只影响mipmap链的最后一层的bug。
若要验证这是原因,请从加载的纹理的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。Box filter并不难实现。高斯也不难。
如果你使用公式生成纹理(因为你说了“生成”),另一种可能的情况是,公式会导致最后一个mip级别的计算错误,这会导致出现垃圾颜色。
还有另一种可能的情况是硬件故障(你不会相信在散热器坏了的过热GPU上可以得到什么样的图片)或驱动程序错误。但这应该会在许多应用程序中造成工件,而不仅仅是在你的程序中。
发布于 2012-02-01 04:20:52
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);
}或者是某种加载/纹理坐标错误,尽管没有足够的信息可以确定(即,一个完整的、最小的程序来演示该问题)。
https://stackoverflow.com/questions/9074586
复制相似问题