gpt4 book ai didi

iphone - iOS/openGL ES - 覆盖 drawRect 似乎会使 openGL 函数 "glGetRenderbufferParameterivOES"行为异常?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:51:45 25 4
gpt4 key购买 nike

我是 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 中绘图时覆盖 View 的 drawRect 方法不安全吗?为什么它可以在模拟器和较旧的 ipod touch 上运行?

最佳答案

您看到的伪像是由于配备 Retina 显示屏的较新设备上的点和像素差异造成的。正如我在回答中描述的那样 here , UIKit 使用点来调整大小,这些点在旧设备上与像素有 1:1 的映射,但现在在当前的 Retina 显示屏上有 1:2 的映射。

OpenGL ES 相反,使用像素进行测量,这就是为什么您在查询其背景大小时看到返回 640x960 的原因。这是应该用于 OpenGL ES 场景视口(viewport)的大小。

我猜想在您尝试运行的代码中某处将 OpenGL ES 场景的视口(viewport)设置为以 View 或图层的点为单位的大小,而不是以像素为单位的适当大小。这导致它缩小到只有四分之一的 View ,就像我在上面的链接答案中发生的情况一样。查找 glViewPort() 和相关调用,并确保它们使用的是背景宽度和高度,而不是 View 或层的宽度和高度。

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

关于iphone - iOS/openGL ES - 覆盖 drawRect 似乎会使 openGL 函数 "glGetRenderbufferParameterivOES"行为异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6960458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com