我在OpenGL 3.1的C#中使用OpenTK包装器。我正在渲染一个场景,其中相同的纹理用于近距离和远距离物体。当我不使用MipMap时,纹理非常清晰(即使纹理对象非常小)但闪烁(如果我理解正确的术语)是可见的 - 当纹理对象移动很远时,纹理的像素似乎闪烁。所以我试着使用mipmap。在将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(' ');
答案 0 :(得分:1)
这里有两个可能的罪魁祸首:在OpenGL实现的glGenerateMipmap中可能会有一个低质量的缩减过滤器。纹理坐标中的轻微各向异性可能会导致模糊滤波。
补救:
实现您自己的图像缩减并单独传递每个mipmap级别(glTexImage2D
级别参数)而不依赖于glGenerateMipmaps
使用各向异性纹理过滤