首页 > 解决方案 > OpenTK 中的最近邻插值模式存在吗?

问题描述

如果我将低分辨率位图绘制到一个大区域System.Drawing.Graphics并将其更改InterpolationModeInterpolationMode.NearestNeighbor,它看起来像素化。我想使用 OpenTK 获得相同的结果。

我尝试使用paint.net的最近neightbour函数在resize时将图像文件的大小调整为更高分辨率,我得到了预期的结果。但我不想调整每一个图像的大小,它会占用更多的磁盘空间,我猜应用程序中有更多的 RAM。

这是我用于我的应用程序的纹理加载方法,因此,我的低分辨率图像看起来很模糊:

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;
}

标签: c#opentk

解决方案


过滤器TextureMinFilterTextureMagFilter需要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);

推荐阅读