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

发布于 2025-01-01 06:27:11 字数 269 浏览 0 评论 0原文

我正在使用 SOIL 生成 OpenGL 纹理。除了 SOIL 中的 mip 贴图生成造成的远处伪像之外,一切都很好。当我不使用该标志时:

SOIL_FLAG_MIPMAPS

它不会出现伪影,但看起来很糟糕。有人见过这样的文物吗?在水面上,有栗色,在沙子上,看起来像浅绿色/蓝色失真。

它看起来像这样:

在此处输入图像描述

I am using SOIL to generate OpenGL textures. Everything is fine except for distant artifacts caused by the mip map generation in SOIL. When I don't use the flag:

SOIL_FLAG_MIPMAPS

It doesn't artifact BUT it looks bad. Has anyone seen artifacts like this? Over the water, there is a maroon color and over the sand, it looks like a light green/blue distortion.

Here is what it looks like:

enter image description here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

泪痕残 2025-01-08 06:27:11

我的猜测是,无论您使用什么来生成 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 上可以获得什么样的图像)或有缺陷的驱动程序。但这应该会在许多应用程序中导致工件,而不仅仅是在您的程序中。

My guess is that that whatever you use to generate mipmap has a bug and doesn't filter mip levels properly - either "leaks" random color from outside of "valid" area in which pixels of previous levels are stored, or forgets to calculate vaules for some pixels. I.e. there is a bug that affects only last levels of mipmap chain.

To verify that this is the cause, read data back from mip levels of a texture you loaded. Using glReadPixels or whatever. If last mip levels contains garbage - it is fault of your texture loading routine. You could also use GL_LINEAR_MIPMAP_NEAREST filter and see if there's a specific mip level with purple pixels.

To bypass the problem, generate image for the first level and use glGenerateMipmaps (OpenGL 3+), glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);(OpenGL 2+ or OpenGL 1.4+ - I forgot in which version it was added. Deprecated in OpenGL 3+), or gluBuild2DMipMap(ancient OpenGL versions).

Or you could calculate mipmaps yourself. Box filter isn't hard to implement. Gaussian isn't hard either.

If you generate textures using formula (since you said "generate") another possible scenario is that the formula causes computation error on last mip level which causes garbage colors to appear.

Yet another possible scenario is faulty hardware (you won't believe what kind of picture you can get on overheated GPU with broken cooler) or buggy driver. But that should cause artifacts in many applications, not just in your program.

情域 2025-01-08 06:27:11

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

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

或者某种加载/纹理坐标错误,尽管还不够确定的信息(即演示问题的完整、最小的程序)。

Anisotropic filtering might help:

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

Alternatively some sort of loading/texture coordinate error, though there's not enough information to be sure (i.e., a complete, minimal program that demonstrates the problem).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文