【问题标题】:OpenGL: Blurred textures when using mipmap (OpenTK)OpenGL:使用 mipmap (OpenTK) 时的模糊纹理
【发布时间】:2014-11-04 16:28:00
【问题描述】:

我在 C# 中为 OpenGL 3.1 使用 OpenTK 包装器。我正在渲染一个场景,其中相同的纹理用于近处和远处的物体。当我不使用 MipMap 时,纹理非常清晰(即使纹理对象非常小),但闪烁(如果我正确理解该术语)是可见的 - 当纹理对象移动很远时,纹理的像素似乎在闪烁.所以我尝试使用mipmaps。将TextureMinFilter改为LinearMipmapLinear并调用GL.GenerateMipmap(GenerateMipmapTarget.Texture2D)后,闪烁效果消失了,但是纹理很模糊,下面是图片对比:

看起来自动生成 mipmap 需要一些调整,但我找不到任何方法告诉 OpenTK 应该构建多少 mipmap 或者应该使用什么方法来缩小原始图像。这是用于加载纹理的代码:

var data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
GL.BindTexture(TextureTarget.Texture2D, textures[idx]);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.LinearMipmapLinear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bmp.Width, bmp.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);
GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);  
bmp.UnlockBits(data);

在使用 mipmap 时可以做些什么来提高纹理清晰度?

更新:

手动生成mipmap后效果一模一样。

解决方案: 我遵循了 datenwolf 的回答并使用了各向异性纹理过滤——这消除了这个问题。我用代码启用了它:

        float maxAniso;
        GL.GetFloat((GetPName)ExtTextureFilterAnisotropic.MaxTextureMaxAnisotropyExt, out maxAniso);
        GL.TexParameter(TextureTarget.Texture2D, (TextureParameterName)ExtTextureFilterAnisotropic.TextureMaxAnisotropyExt, maxAniso);

支持的扩展列表可以通过以下方式获得:

var extensions = GL.GetString(StringName.Extensions).Split(' ');

【问题讨论】:

  • 关于构建多少个mipmap,有一个非常系统的方法来完成。我已经在另一个answer to a similar question 中概述了这一点。您可能会发现浏览一下很有用。

标签: c# .net opengl 3d textures


【解决方案1】:

这里有两个可能的罪魁祸首: OpenGL 实现的 glGenerateMipmap 中可能只有一个低质量的缩小过滤器。纹理坐标中的轻微各向异性可能会导致过滤更模糊。

补救措施:

  • 实现您自己的图像缩小并单独传递每个 mipmap 级别(glTexImage2D 级别参数),而不依赖 glGenerateMipmaps

  • 使用各向异性纹理过滤

【讨论】:

  • 我会试试看的。至于现在我注意到添加 GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMaxLevel, 3);使纹理不那么模糊,但这只是因为这迫使 OpneGL 只使用少数生成的 mipmap。
  • 我测试了应用我自己的缩小图像(它们很清晰),但是当它们被 openGL 用作纹理时,它们会以相同的方式模糊。所以这不是 GenerateMipmap 的问题,而是 LinearMipmapLinear 选项的解释方式。我找不到如何在 OpenTK 中使用各向异性过滤
  • @PanJanek:这是因为出于历史知识产权(即专利)的原因,它是一个非 ARB OpenGL 扩展。详细解释见Arcsynthesis Anisotropy Tutorial末尾。
猜你喜欢
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多