如何使旧的 OpenGL ES 1 设置适应 iPhone 6 Plus?

How to adapt the old OpenGL ES 1 setup to iPhone 6 Plus?

如果我不是地球上最后一个使用第一版 OpenGL ES 的人:有没有人处理过将 resizeFromLayer 函数适应新的 3x在 iPhone 6 Plus 上缩放?

下面的代码完全适用于所有以前的 iPhones:

- (BOOL)resizeFromLayer:(CAEAGLLayer *)layer {
glGenFramebuffersOES(1, &viewFramebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:layer];
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);

const GLfloat zNear = 0.1f, zFar = 8100.0f, fieldOfView = 60.0;
CGRect rect = layer.bounds;
GLfloat size;

glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
size = zNear * tanf(DEGREES_TO_RADIANS(fieldOfView) / 2.0);

glFrustumf(-size, size, -size / (rect.size.width / rect.size.height), size / (rect.size.width / rect.size.height), zNear, zFar);

glRotatef(-90.0, 0.0, 0.0, 1.0);

if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
{
    NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
    return NO;
}

return YES;

}

虽然我已经更新了新手机的启动图像(因此该应用程序检测到 414x736 点),但它似乎仍然像在 'zoomed mode'(对于旧应用程序)中一样工作。

有人看到解决方案吗?非常感谢您的帮助。

虽然问题有点偏离主题,但我们设法找到了解决方案。问题在于从 UIView 层获取渲染缓冲区,该层返回 1x 缩放缓冲区,这意味着分辨率太低。此问题与 iOS 上的任何版本的 openGL ES 无关,并且可以在所有版本上产生。

您使用一种方法 renderbufferStorage:fromDrawable: 从层生成渲染缓冲区存储。层本身需要将其 contentScale 设置为屏幕比例,以使用评论中已经提到的 self.layer.contentsScale = [UIScreen mainScreen].scale; 获得适当的分辨率。

请注意,所有其他代码均与此事无关。