如何为iPad创build1536x2048 framebuffer视网膜样本(GLGravity)

所以当然,我在我的新iPad(4g)上尝试的第一件事是旧的GLGravity示例。 我所做的唯一修改是将目标设备设置为“iPad”。

但是,在设备上运行时,UIView的边界被设置为768,1024,就像createFramebuffer中的“backingWidth,backingHeight”一样。

目光确认图像仍然在768×1024处呈现。 我错过了什么 – 我如何得到这个以原始分辨率呈现?

为了启用对Retinagraphics的条件支持,就像我们为iPhone 4所做的那样,在OpenGL ES托pipe视图(在这种情况下为GLGravityView)的设置中需要有一行代码:

self.contentScaleFactor = [[UIScreen mainScreen] scale]; 

这确保了该视图中的内容(例如Quartz绘图 )以iPhone和iPad上当前Retina显示中使用的每像素点2个像素的比例进行渲染。

您的视图的边界将保持在768 x 1024点的大小,但当通过glGetRenderbufferParameterivOES()查询时,渲染缓冲区将返回1536 x 2048作为其像素尺寸。 这将允许您在OpenGL ES上下文中渲染视网膜级graphics。

请注意,苹果的一些示例代码(如GLGravity) 使用视图边界来设置其他显示元素的大小 ,因此它们在场景中显示的太小。 您可能需要根据视图边界(以点为单位)和背景宽度(以像素为单位)来replace计算,以确保视网膜graphics的2.0缩放被考虑在内。

作为这个答案的一个扩展,GLGravity示例需要进行另一个更改以确保GL视口设置正确。 这是因为bounds属性返回Quartz点,而不是像素。

 -(void)setupView { ... CGRect rect = self.bounds; // new code - modify the viewport dimensions. rect.size.width *= self.contentScaleFactor; rect.size.height *= self.contentScaleFactor; // end of new code glFrustumf(-size, size, -size / (rect.size.width / rect.size.height), size / (rect.size.width / rect.size.height), zNear, zFar); glViewport(0, 0, rect.size.width, rect.size.height); ... } 

我有同样的问题:@ 2个iPad的图像存在,但在新的iPad上,所有东西都呈现@ 1x。 iPhone / iPod Touch可以在视网膜和非视网膜设备上正常工作。 search苹果开发论坛,我发现这个问题:我仍然在iOS 5.0的Xcode 4.2。 这个操作系统没有预见到视网膜ipad的可能性。 所以我需要用5.1来构build。

我想我得到这个。

XIB文件的测量点数 ,而不是像素。 点是距离的单位,如厘米,或光年 。 像素不是距离的单位,它代表“像素”。 不同的设备可以有不同的像素密度。

你的XIB文件以磅为单位来显示你的显示区域的大小。 iPhone应用默认为320×480 ,iPad 768×1024 。 你可以在你的xib文件中检查一下。

现在,Brad引用的self.contentScaleFactor 就是答案 。 这个值的作用是: “从默认的逻辑坐标空间(768×1024 )转换到该屏幕的设备坐标空间(1536×2048 像素 )。

换句话说, self.contentScaleFactor是设备使用的pixels / pt的度量。 这个值在设备间自然而然地变化。 XCode可以指定pts (真实世界距离的单位)中的UI元素,所以事情不会出现在不同的分辨率上。

你甚至可以设置self.contentScaleFactor=4 ,实际上看起来有点酷(它超级样本)(但可以运行缓慢)。

这里的另一个问题是触摸事件总是在 ,而不是像素。 也就是说,视网膜设备仍然只能以768×1024的比例parsing触摸事件

所以,如果你的视图支持触摸拾取,你需要乘以self.contentScaleFactor每个传入的触摸事件,以便在self.contentScaleFactor中的传入位置映射到帧缓冲区中的像素