如何使旧的 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;
获得适当的分辨率。
请注意,所有其他代码均与此事无关。
如果我不是地球上最后一个使用第一版 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;
获得适当的分辨率。
请注意,所有其他代码均与此事无关。