为Retina和非Retina显示器开发OpenGL ES

7

在着手下一个项目之前,我想寻求一些建议。我希望支持 iOS 中现有的所有分辨率(retina、非 retina 的 iPhone 和所有 3 个 iPad)。开发人员通常是如何完成这个任务的?我看到过类似的问题,但都是特定的情况。我要求的是全套解决方案。例如,我想支持不同分辨率位图字体、图像等。

设备特定的开关或 if 语句是标准的吗?

提前感谢您的所有帮助。

E

编辑:我从 Apple 找到了这个:

如果您的应用程序使用 OpenGL ES 进行渲染,则您现有的绘制代码应该可以无需任何更改即可继续工作。但是,当在高分辨率屏幕上绘制时,您的内容将相应地缩放并且会显得更加块状。块状外观的原因是 CAEAGLLayer 类的默认行为与其他 Core Animation 层对象相同,它用于背面 OpenGL ES 渲染缓存。换句话说,它的比例因子最初设置为 1.0,这导致 Core Animation 合成器在高分辨率屏幕上缩放层的内容。为避免这种块状外观,您需要增加 OpenGL ES 渲染缓存的大小以匹配屏幕的大小(使用更多像素可以增加提供内容的详细程度)。然而,因为将更多像素添加到渲染缓存会对性能产生影响,所以您必须显式地选择支持高分辨率屏幕。

要启用高分辨率绘图,您必须更改用于呈现 OpenGL ES 内容的视图的比例因子。将视图的 contentScaleFactor 属性从 1.0 更改为 2.0 将触发底层 CAEAGLLayer 对象的匹配比例因子更改。您用于将层对象绑定到渲染缓存的 renderbufferStorage:fromDrawable: 方法通过将层的边界乘以其比例因子来计算渲染缓存的大小。因此,将比例因子加倍将使结果渲染缓存的宽度和高度加倍,给您的内容提供了更多像素。之后,您需要为这些额外的像素提供内容。

所以我的更新问题是如何执行上述操作中的比例因子加倍?

编辑 2:

我已经接近成功了......

我正在使用以下代码在 EAGLView 中进行缩放:

        // Adjust for retina displays
    if ([self respondsToSelector:@selector(setContentScaleFactor:)])
    {
            self.contentScaleFactor = [[UIScreen mainScreen] scale];
    }

唯一的问题是图片位置有些混乱。现在,显示的图片可以根据分辨率进行缩放,但在更高分辨率下,图片会从屏幕中间开始显示。请帮忙解决!
第三次编辑:问题已解决!!!问题出在我的屏幕方向上。
您需要确保已更新翻译。我使用了这个:
    glTranslatef( width / 2, height /2, 0);
glRotatef(-90, 0, 0, 1);
glTranslatef(-1 * (height / 2),-1 * (width / 2),0);

感谢您的阅读。希望这篇内容能对某些人有所帮助。

在iPad3上设置contentScale = 2以支持Retina显示有什么进展吗?http://stackoverflow.com/questions/11276027/where-to-start-with-an-opengl-painter-for-the-retina-display - Yogev Shelly
我还没有尝试过iPad的Retina显示屏。等我尝试后再回来告诉你。 - Calm Turtle
2个回答

2
请参阅视图编程指南:视图几何和坐标系统。

http://developer.apple.com/library/ios/#DOCUMENTATION/WindowsViews/Conceptual/ViewPG_iPhoneOS/WindowsandViews/WindowsandViews.html

坐标值使用浮点数表示,这样无论底屏幕分辨率如何,都可以精确布局和定位内容。这意味着您指定的点(例如GCRect等)不是像素,而是经过调整的点,适用于Retina和非Retina屏幕。
最后,正如Cocoa Priest所指出的那样,您可以维护png图像及其*@2x.png版本: 在iPhone上使用Retina显示图像 Retina显示应用程序中@2x的意义是什么? 此外,这里有一篇关于为Retina设计的文章: http://globalmoxie.com/blog/designing-for-iphone4-retina-display.shtml

2
我感谢您的回复。我一定会阅读那份指南。我认为这对我不起作用(可能是我错了)。因为我应该首先提到,我的所有图像都来自OpenGL ES而不是UIKit。 - Calm Turtle

-2

你只需要在你的资源包中拥有@2x版本的图片。如果iOS运行在Retina硬件上,它会自动使用@2x版本。


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