【发布时间】: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