我试图让我的 OPENGL ES 应用程序支持视网膜显示。我添加了带有@2x 扩展名的图像并将内容比例因子设为2。高分辨率图像正确进入屏幕,但质量损失很大。边缘和模糊,它没有我添加到资源文件夹中的图像质量。
我怎样才能解决这个问题?
我试图让我的 OPENGL ES 应用程序支持视网膜显示。我添加了带有@2x 扩展名的图像并将内容比例因子设为2。高分辨率图像正确进入屏幕,但质量损失很大。边缘和模糊,它没有我添加到资源文件夹中的图像质量。
我怎样才能解决这个问题?
我的应用程序基于默认框架,在基于 Retina 的设备上运行时遇到了这个问题。具体来说,我的帧缓冲区是在 320x480 而不是我想要的 640x960 下创建的。抱歉,James 但这不是自动的,因为问题出在由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 的有用评论。
在您的 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);
我希望这能为您指明正确的方向。