Я использую оболочку OpenTK в C# для OpenGL 3.1. Я создаю сцену, где одни и те же текстуры используются для объектов ближнего и дальнего действия. Когда я не использую MipMap, текстуры очень острые (даже если текстурированный объект очень мал), но сцинтилляция (если я правильно понимаю термин) видна - пиксели текстуры кажутся мигающими, когда текстурированный объект движется далеко , Поэтому я попытался использовать mipmaps. После перехода к TextureMinFilter в LinearMipmapLinear и вызов GL.GenerateMipmap (GenerateMipmapTarget.Texture2D) сцинтилляционные эффектов нет, но текстуры очень размыты, здесь изображения для сравнения:OpenGL: размытые текстуры при использовании mipmap (OpenTK)
Похоже, автоматических генерация mipmaps требует некоторой настройки, но я не мог найти никакого способа сообщить OpenTK, сколько mipmaps должно быть построено или какой метод следует использовать для масштабирования исходных изображений. Это код, используемый для загрузки текстур:
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);
Что может быть сделано для улучшения текстуры резкости при использовании мипа?
UPDATE:
После генерации мипмапов вручную эффект точно такой же.
РЕШЕНИЕ: Я последовал ответ 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(' ');
Что касается сколько mipmaps построено, есть очень систематический способ, который делается. Я изложил это в другом [ответе на аналогичный вопрос] (http://stackoverflow.com/questions/21284586/glteximage2d-vs-glubuild2dmipmaps/21290595#21290595). Вы можете взглянуть на это полезное. –