iOS/openGL ES - 覆盖 drawRect 似乎使 openGL 函数"glGetRenderbufferParameterivOES"行为不当?



我对openGL很陌生,我一直在尝试从一本关于iphone游戏编程的书中获得一些示例代码,我目前正在阅读。其中一个样本是一款3d游戏,我能够成功地在iOS模拟器(全屏)上编译并运行它。

我遇到的问题是,当我在实际硬件(ipod touch 4G)上运行它时,游戏不会全屏(它只占屏幕的1/4)。我能够将问题缩小到下面的代码:

GLint backingWidth, backingHeight;
- (BOOL) bindLayer
{
....
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
....
}

由于某种原因,backingWidth和backingHeight在上述调用后分别被设置为640和960(我期望它是320 x 480,这是iphone的屏幕尺寸)。在iOS模拟器和较旧的ipod touch (2g)上,它运行得很好。

上面的代码是一个子类UIView对象的一部分,并覆盖了drawRect方法(虽然它是空的)。让我困惑的是,当我删除了drawRect方法(因此没有重写它),它在某种程度上解决了我上面描述的问题。

有人能解释一下吗?当你在openGL中绘图时,重写视图的drawRect方法是否不安全?为什么它能在模拟器和老式ipod touch上运行?

您看到的是由于带有Retina显示器的新设备上的点和像素差异造成的伪影。正如我在这里的回答中所描述的,UIKit使用点进行大小调整,在旧设备上有1:1的像素映射,但现在在当前的Retina显示设备上有1:2的映射。

OpenGL ES,相反,使用像素的测量,这就是为什么你看到640x960返回时查询它的支持大小。这是应该用于OpenGL ES场景的视口的大小。

我猜在代码的某个地方,你试图运行的是设置你的OpenGL ES场景的视口是你的视图或层的点的大小,而不是适当的像素大小。这导致它缩小到只有四分之一的视图,就像我上面的链接答案所发生的那样。寻找glViewPort()和相关的调用,并确保它们使用的是背景宽度和高度,而不是视图或图层的宽度和高度。

-drawRect:应该与此无关,除非在某处有设置视口大小的代码。

最新更新