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

时间:2013-07-04 05:44:10

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

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

在新设备上,我只得到黑屏。在视网膜模拟器上,我得到一个粉红色的屏幕。 程序甚至不会使用我用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];

我按如下方式设置视口的大小:

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];

我在视图加载时记录了比例,并且它在视网膜设备上正确设置为2.0或在旧设备上设置为1.0。

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

2 个答案:

答案 0 :(得分:5)

有人提到调用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);

答案 1 :(得分:4)

我遇到了同样的问题。不需要调用eaglLayer.contentsScale = [[UIScreen mainScreen] scale];,您必须将帧尺寸乘以屏幕比例。所以问题的解决方案是:

CGFloat screenScale = [UIScreen mainScreen].scale;
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, CGRectGetWidth(self.bounds) * screenScale, CGRectGetHeight(self.bounds) * screenScale);