OpenGL超级分辨率问题

时间:2016-06-28 06:18:45

标签: opengl

我有一个基于OpenGL的gui。我使用超级分辨率来处理各种尺度。它们不是缩放图像,而是缩小尺寸(除非有人以4000x4000 +分辨率运行)。

问题是,OpenGL似乎没有顺利缩减。我有工件,好像缩放是最近邻居。 (例如,文本边缘是块状的,即使它们不在原文中)

这些是我使用的设置:

    glBindTexture(GL_TEXTURE_2D, tex);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

以下是工件的示例,我相信缩放比例是2:1。由于窗边缘等原因,它可能并不准确。

enter image description here

你可以看到左边看起来很完美(虽然不是这样),但右边有奇怪的断裂。原始图形完全对称,没有任何文物。

我已经尝试过GL_NEAREST,GL_LINEAR。没有mipmapping所以...

当然,OpenGL在缩放方面不是很差吗?我喜欢像双立方缩放之类的东西或能产生良好效果的东西。

我正在使用OpenGL 1.1。我可以预先缩放图像,但每次窗口大小改变时我都必须这样做,并且在cpu中可能会很慢。

我的一些图像也有锯齿状的边缘。超级决议的全部意义在于避免这一切; /

我缺少一些设置吗?

3 个答案:

答案 0 :(得分:3)

首先,您必须了解信号理论,即Nyquist Theorem(维基百科页面在"时间"域中讨论信号时过于具体;这些原则适用于所有类型的离散采样信号,包括图像)。下采样时,必须应用lowpass anti aliasing filter,以切断采样频率一半以上的所有频率成分,以避免产生混叠伪像。如果没有过滤,即使线性积分下采样器也会产生伪像。实现纹理低通滤波器的实时图形方式是 mipmaps 。每个mipmap级别的切断频率恰好是下一个更高级别的一半。

您现在有两个选择:

  • 实施mipmapping
  • 实施下采样片段着色器

当然,理所当然的事情不是首先渲染过多的分辨率,而是在完全目标分辨率下渲染GUI。

答案 1 :(得分:0)

使用您提供的代码,我将猜测可能存在的问题。

尝试加载图像或至少在之前分配内存,然后使用glParameteri设置这些纹理参数。另外,将GL_TEXTURE_MIN_FILTER设置为GL_LINEAR

也许您的意思是超级采样(SSAA)使用原始分辨率的2倍或更多倍并对其进行下采样以获得平滑的图像?

答案 2 :(得分:0)

从你的图像看它正在使用线性过滤(双线性) 尝试使用各向异性过滤:

    glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &aniso);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);

各向异性过滤可以应用于不同级别,此代码将在最高级别应用它,如果您愿意,可以使用小于aniso的数字。这些是扩展宏,如果你没有扩展防御,它们是:

#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF