视网膜显示屏图像质量问题

6

我试图让我的OPENGL ES应用支持视网膜显示。我添加了带有@2x扩展名的图像,并将内容比例因子设置为2。高分辨率图像已正确显示在屏幕上,但质量严重下降。边缘模糊,没有我添加到资源文件夹中的图像质量。

我该怎么解决这个问题?


你已经在真实的Retina设备或者模拟器上测试过它了吗? - Max
3个回答

5
我的应用程序基于默认框架,当在Retina设备上运行时,我遇到了这个问题。具体而言,我的帧缓冲区被创建为320x480,而不是我想要的640x960。很抱歉詹姆斯,但这并不是自动的,因为问题出在由renderBufferStorage:fromDrawable:(它代表我们调用glRenderbufferStorage,但默认情况下使用布局像素而不是本机设备像素来指定宽度和高度)创建的帧缓冲区。

我在EAGLView.m中的initWithCoder:中,在设置eaglLayer.drawableProperties的行下面添加了以下代码:

UIScreen *mainScreen = [UIScreen mainScreen];
if ([mainScreen respondsToSelector:@selector(scale)])
{
    // iOS 4.0 and up (further to simeon's comment)
    const CGFloat scale = mainScreen.scale;
    self.contentScaleFactor = scale;
    eaglLayer.contentsScale = scale;
}

感谢David Amador的帖子指引我正确的方向。最近,也感谢simeon的有用评论。


我不建议明确检查视网膜尺寸,因为这在所有情况下都不起作用(例如,视网膜iPad)。请参见下面的答案,以获取使用屏幕比例因子的更通用解决方案。 - simeon
您不需要else分支,因为没有视网膜预iOS 4.0设备,所以如果mainScreen不响应scale选择器,则可以确定它是非视网膜屏幕。 - simeon
你提出了一个非常有趣的观点。我猜这个API必须为Retina设备引入,并且必须存在于它们上面!谢谢Simeon。我会再次更新。 :) - Quintin Willison

1
在您的 EAGLView.m initWithCoder: 方法中,添加以下代码:
if( [[UIScreen mainScreen] respondsToSelector:@selector(scale)] )
{
    self.contentScaleFactor = [[UIScreen mainScreen] scale];   
}

-1

OpenGLES会自动在视网膜显示器上以最大可能的分辨率进行渲染(假设您已将视口设置为屏幕的宽度和高度等等),因此问题来自于您的OpenGL渲染。

OpenGLES不关心您附加到图像上的@2X后缀(这是针对Cocoa Touch框架的)。但是,它确实关心图像的分辨率。为了获得最佳效果,您应该使用宽度和高度都是2的幂次方的正方形图像(例如1024、2048等)。

您应该确保在将纹理加载到OpenGLES时,使用了正确的图像格式,并且没有以任何方式压缩它。

您应该尝试的另一件事是纹理参数。例如:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

希望这能指引你朝着正确的方向前进。


谢谢你的帮助。但是即使我尝试了你说的方法,它仍然没有显示出高质量。请问如何知道图像是否已经压缩?如果使用多重采样,会得到更好的结果吗? - Aaron
你能否在问题中添加一些代码,以便了解如何将纹理加载到OpenGLES中?我认为如果使用多重采样(这更多是一种优化),结果可能不会更好。 - James Bedford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接