我有一个基于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。由于窗边缘等原因,它可能并不准确。
你可以看到左边看起来很完美(虽然不是这样),但右边有奇怪的断裂。原始图形完全对称,没有任何文物。
我已经尝试过GL_NEAREST,GL_LINEAR。没有mipmapping所以...
当然,OpenGL在缩放方面不是很差吗?我喜欢像双立方缩放之类的东西或能产生良好效果的东西。
我正在使用OpenGL 1.1。我可以预先缩放图像,但每次窗口大小改变时我都必须这样做,并且在cpu中可能会很慢。
我的一些图像也有锯齿状的边缘。超级决议的全部意义在于避免这一切; /
我缺少一些设置吗?
答案 0 :(得分:3)
首先,您必须了解信号理论,即Nyquist Theorem(维基百科页面在"时间"域中讨论信号时过于具体;这些原则适用于所有类型的离散采样信号,包括图像)。下采样时,必须应用lowpass anti aliasing filter,以切断采样频率一半以上的所有频率成分,以避免产生混叠伪像。如果没有过滤,即使线性积分下采样器也会产生伪像。实现纹理低通滤波器的实时图形方式是 mipmaps 。每个mipmap级别的切断频率恰好是下一个更高级别的一半。
您现在有两个选择:
当然,理所当然的事情不是首先渲染过多的分辨率,而是在完全目标分辨率下渲染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