繁体   English   中英

iOS / openGL ES-覆盖drawRect似乎会使openGL函数“ glGetRenderbufferParameterivOES”出现异常?

[英]iOS/openGL ES - Overriding drawRect seems to make openGL function “glGetRenderbufferParameterivOES” misbehave?

我对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:与此无关,除非其中有用于设置视口大小的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM