iPad 3 - 使用kEAGLDrawablePropertyRetainedBacking和Retina显示屏存在OpenGL错误?

9
我有一个iOS的OpenGL应用程序,使用kEAGLDrawablePropertyRetainedBacking属性将当前帧绘制在上一帧的顶部,这是一种廉价的获取运动轨迹等效果的方法。
它在所有设备(包括配备视网膜的iPhone)和所有设备模拟器上都很好用,但在实际的iPad 3设备上,上一帧被垂直压缩到其以前大小的75%。
例如,如果我每帧在屏幕底部绘制一个100 x 100的正方形,则在第0帧中有一个正方形,在第2帧中有一个偏向屏幕顶部的100 x 75的回声,在第三帧中有一个更多偏移的100 x 56的额外回声(56 ~= 75 * 0.75),依此类推。应该发生的是所有回声都保持在原地。
我已经验证了两个设备的行为,所以我不认为这只是一个损坏的iPad。
有什么想法吗?
谢谢,
orion

刚刚意识到 1536 = 2048*0.75,这让我想到某个系统在同时使用图像的宽度和高度。 - orion elenzil
4
我已经可以通过苹果的Xcode 4.0.1中的OpenGL示例应用程序来重现此问题,这显然是设备上的一个漏洞。已向苹果报告编号为11069618的错误。 - orion elenzil
我可以证实这个 bug(仅在实际的 Retina iPad 硬件上出现),并已经提交了另一个带有演示问题示例项目的 bug 报告。 - Brad Larson
1
我能够通过自己渲染到纹理来解决这个问题,从长远来看,这确实是一种更健壮的解决方案。唯一棘手的部分是分配纹理为适当的2的幂次维度,然后渲染到其子部分。值得一提的是,苹果已经确认了这个错误,并将其作为错误#11070429进行调查。 - orion elenzil
@orionelenzil 如果在调用 glTexImage2D 之前调用 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);,则不需要使用二次幂纹理。这将使您的代码更简单、更高效。 - rasmus
显示剩余3条评论
2个回答

3
我遇到了一个bug。由于我对OpenGL一无所知,因此无法像建议的那样通过纹理来解决它,但是我成功地切换到了基于Quartz 2D绘图的快速实现,该方法是基于http://blog.effectiveui.com/?p=8105的教程和如何在Retina上运行的指南https://dev59.com/rWgv5IYBdhLWcg3wD8uY#10870188。事实上,比起我从苹果GLPaint示例代码中借鉴的代码,这种方法速度更快。

1

这是关于保留备份和视网膜iPad在iOS 5.x中已确认的错误。自从iOS 6.0及以上版本以后,该问题已经被修复。


是的,我可以确认这个问题在具有iOS 6的iPad retina上已经修复了。 - orion elenzil

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