2016-06-28 232 views
0

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

问题是,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 I相信。也许这不是确切的,但由于窗口边缘等。

enter image description here

你可以看到左侧边缘看上去很完美(它不是虽然),但右边缘有奇怪的休息。原始图形是完全对称的,没有文物。

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

当然,OpenGL是不是那么差缩放?我喜欢双立方缩放或其他能够产生良好效果的东西。

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

我在一些图片上也有锯齿边缘。超分辨率的全部点是为了避免这一切;/

有一些设置我失踪了吗?

+1

超分辨率有点令人误解,因为你的问题涉及下采样。尽管如此,从最近线性变为线性,您应该在小比例缩放时看到差异,例如原始的1/1.2。 'GL_NEAREST'肯定是最近邻居插值。 – mainactual

回答

0

随着你提供的代码,我会猜测什么可能是问题。

尝试加载您的图像或至少分配内存之前您设置这些纹理参数glParameteri。而且,设置GL_TEXTURE_MIN_FILTERGL_LINEAR


也许你的意思是超级采样(SSAA)使用原始分辨率的2倍以上,并下采样它得到一个平滑的图像?

0

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

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

各向异性过滤可以在不同级别上应用,这个代码将在最高级别应用如果你愿意,你可以使用小于aniso的数字。这些都是extention宏,如果你不具备进一步扩展defenitions,他们是这样的:

#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE 
#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF 
3

首先你要明白的信号理论,即在说话的信号当“Nyquist Theorem(维基百科页面过于具体时间“域;对于各种离散采样信号(包括图像),这些原理是通用的。当你总是采样下采样必须申请一个lowpass anti aliasing filter切断采样频率一半以上的所有频率分量,以避免产生混叠伪像。如果不进行滤波,即使线性积分下采样器也会产生伪像。实现纹理低通滤波器的实时图形方式是mipmapps。每个mipmap级别都会在下一个更高级别的一半频率处切断。

你有现在两个选项:

  • 实施mipmapping贴图
  • 实现一个采样片段着色器

当然,理智的事情会不会在过量的分辨率渲染第一个地方,但你的GUI在正好目标分辨率。