Ближайший соседний режим интерполяции в OpenTK существует? - PullRequest
0 голосов
/ 20 мая 2019

Если я рисую растровое изображение с низким разрешением в большую область с System.Drawing.Graphics и меняю его InterpolationMode на InterpolationMode.NearestNeighbor, оно выглядит пиксельным. И я хочу добиться того же результата, используя OpenTK.

Я попытался изменить размеры файлов изображений с более высоким разрешением, используя ближайшую соседнюю функцию paint.net по изменению размера, и получил ожидаемые результаты. Но я не хочу изменять размер каждого отдельного образа, и он занимает больше места на диске, и я предполагаю, что в приложении больше оперативной памяти.

Это метод загрузки текстуры, который я использую для своего приложения, и при этом мое изображение с низким разрешением выглядит размытым:

public static int LoadTexture(Bitmap bmp)
{
GL.Enable(EnableCap.Texture2D);

int tex;
GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest);

GL.GenTextures(1, out tex);
GL.BindTexture(TextureTarget.Texture2D, tex);

BitmapData data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
    ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0,
    OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);
bmp.UnlockBits(data);

GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat);

return tex;
}

1 Ответ

0 голосов
/ 20 мая 2019

Фильтр для TextureMinFilter и TextureMagFilter должен быть Nearest вместо Linear.Поэтому вам нужно заменить эти строки:

GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);

на эти:

GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);
...