OpenTK中是否存在最近的海特插值模式?

时间:2019-05-19 22:37:07

标签: c# opentk

如果我使用System.Drawing.Graphics将低分辨率位图绘制到大区域并将其InterpolationMode更改为InterpolationMode.NearestNeighbor,则它看起来像是像素化的。 而且我想使用OpenTK达到相同的结果。

我尝试使用paint.net的最近的eightbour函数在调整大小时将图像文件的大小调整为更高的分辨率,并且得到了预期的结果。但是我不想调整每个映像的大小,它占用了磁盘上更多的空间,并且我猜想应用程序中会有更多的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;
}

1 个答案:

答案 0 :(得分:0)

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