【发布时间】:2013-02-21 21:44:53
【问题描述】:
我试图让我的 OPENGL ES 应用程序支持视网膜显示。我添加了带有@2x 扩展名的图像,并将内容比例因子设为2。高分辨率图像正确进入屏幕,但质量损失很大。边缘和模糊,它没有我添加到资源文件夹中的图像质量。
我该如何解决这个问题?
【问题讨论】:
-
你在真正的视网膜设备或模拟器上测试过吗?
标签: iphone opengl-es retina-display
我试图让我的 OPENGL ES 应用程序支持视网膜显示。我添加了带有@2x 扩展名的图像,并将内容比例因子设为2。高分辨率图像正确进入屏幕,但质量损失很大。边缘和模糊,它没有我添加到资源文件夹中的图像质量。
我该如何解决这个问题?
【问题讨论】:
标签: iphone opengl-es retina-display
我的应用基于默认框架,在基于 Retina 的设备上运行时遇到了这个问题。具体来说,我的帧缓冲区是在 320x480 而不是我想要的 640x960 下创建的。抱歉,James,但这不是自动的,因为问题出在 renderBufferStorage:fromDrawable: 创建的帧缓冲区上(它代表我们调用 glRenderbufferStorage,但默认情况下指定布局像素而不是本机设备像素的宽度和高度)。
我在 initWithCoder: 中的 EAGLView.m 中设置 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 的 post 为我指明了正确的方向。最近感谢 simeon 的帮助 cmets。
【讨论】:
else分支,因为没有retina pre-iOS 4.0设备,所以如果mainScreen没有响应scale选择器,你可以确定它是非视网膜。
在您的 EAGLView.m initWithCoder: 方法中,添加以下代码:
if( [[UIScreen mainScreen] respondsToSelector:@selector(scale)] )
{
self.contentScaleFactor = [[UIScreen mainScreen] scale];
}
【讨论】:
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);
我希望这会为您指明正确的方向。
【讨论】: