У меня есть код, который выглядит следующим образом:
_bfTex = new Texture(TextureTarget.Texture2D, true);
_bfTex.Image2D("Textures/sphax/terrain128.png", 0);
_bfTex.Image2D("Textures/sphax/terrain64.png", 1);
_bfTex.Image2D("Textures/sphax/terrain32.png", 2);
_bfTex.Image2D("Textures/sphax/terrain16.png", 3);
_bfTex.Image2D("Textures/sphax/terrain8.png", 4);
_bfTex.Image2D("Textures/sphax/terrain4.png", 5);
_bfTex.Image2D("Textures/sphax/terrain2.png", 6);
_bfTex.Image2D("Textures/sphax/terrain1.png", 7);
_bfTex.SetMinFilter(TextureMinFilter.NearestMipmapNearest);
_bfTex.SetMagFilter(TextureMagFilter.Nearest);
_bfTex.SetParameter(TextureParameterName.TextureWrapS, TextureWrapMode.ClampToEdge);
_bfTex.SetParameter(TextureParameterName.TextureWrapT, TextureWrapMode.ClampToEdge);
Функция Image2D
выглядит следующим образом:
public void Image2D(Bitmap bmp, int mipmapReductionLevel = 0)
{
var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
var data = bmp.LockBits(rect, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
GL.TexImage2D(TextureTarget.Texture2D, mipmapReductionLevel, PixelInternalFormat.Rgba, data.Width, data.Height, 0,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);
bmp.UnlockBits(data);
}
(код в C #, но должен отображаться1: 1 с C API)
Я подумал, что если бы я звонил glTexImage2D
несколько раз с разными уровнями уменьшения mipmap, я бы тогда мог использовать свою текстуру с mipmapping, но Ничего кажется, что он нарисован на экране (даже не черная текстура).
Если я просто изменю минимальный фильтр на «ближайший», все будет выглядеть нормально, как и ожидалось, так что это определенно проблема с mipmapping.
Если я вместо этого использую glGenerateMipmap
для создания своего mipmap, это также работает.
Причина, по которой я хочу создать свой собственный mipmap, заключается в том, что это spritemap, и он выглядит как некоторые из краевспрайты кровоточат вместе во время изменения размера, поэтому я сделал отдельные изображения, которые имеют острые края между спрайтами.