iphone - 添加视网膜显示支持会导致 OpenGL ES 不绘制任何内容

标签 iphone ios opengl-es ios-simulator retina-display

我有一个在 OpenGL ES 2.0 中绘制场景的应用程序。 在 iPhone 和 iPad 模拟器以及真实设备上,一切都可以正确呈现,只要我不尝试使用 Retina 显示器。 Retina 设备仍在绘制,但分辨率与旧设备相同。

在新设备上,我只看到黑屏。在视网膜模拟器上,我得到一个粉红色的屏幕。 该程序甚至不会使用我用 glClearColor() 设置的值;

我可以使用以下代码正确设置设备的比例因子:

_eaglLayer = (CAEAGLLayer *)self.layer;
_eaglLayer.opaque = YES;

self.contentScaleFactor = [[UIScreen mainScreen] scale];
_eaglLayer.contentsScale = [[UIScreen mainScreen] scale];

而且我可以在这里正确地创建渲染缓冲区:

glGenRenderbuffers(1, &_depthRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _depthRenderBuffer);

glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, self.frame.size.width, self.frame.size.height);
//Context is an instance of EAGLContext
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];

我将视口(viewport)的大小设置如下:

glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &_backingWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_backingHeight);

...

glViewport(0, 0, _backingWidth, _backingHeight);

所有这些代码都可以在旧设备上运行,如果我注释掉以下行,它可以完美运行:

self.contentScaleFactor = [[UIScreen mainScreen] scale];
_eaglLayer.contentsScale = [[UIScreen mainScreen] scale];

我在 View 加载时记录了比例,它正确地将值设置为视网膜设备上的 2.0 或旧设备上的 1.0。

我尝试了多种设置比例因子的不同解决方案和方法,但都无济于事。我知道有些东西我只是没有看到,但我找不到它。有什么建议吗?

最佳答案

其他人提到调用 eaglLayer.contentsScale 不是必需的,但出于某种原因,这仅在我调用它时有效。我在 UIView 子类中使用以下代码,并且在所有设备上呈现效果都很好:

CGFloat scale = [[UIScreen mainScreen] scale];

_eaglLayer.contentsScale = scale;
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];

CGSize s = self.frame.size;
glViewport(0, 0, s.width * scale, s.height * scale);

关于iphone - 添加视网膜显示支持会导致 OpenGL ES 不绘制任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17462671/

相关文章:

ios - GLSL 着色器错误 "Constructor calls may not have precision"

iphone - Iphone 上的多个 OpenGL ES View 是否有高效和标准化的代码?

ios - CoreData MagicalRecord 保存方法在 iPhone5 上崩溃

php - 如何使用 php 将 iOS 应用程序连接到 mySQL 数据库

ios - 框架宽度返回大数

ios - 为什么 switch 语句中不允许使用 `case self > 0: return .positive`

iphone - 为什么视网膜显示屏 iPhone 模拟器中缺少主页按钮

iphone - 在 Objective-c 中编码二维数组

javascript - 在 iOS 12.2 上的 safari 中使用 JavaScript 请求运动访问

android - iOS/Android 回到 OpenGL 1.1 而不是使用 2.0