添加Retina显示屏支持导致OpenGL ES无法绘制任何内容。

4
我有一个在OpenGL ES 2.0中绘制场景的应用程序。 只要我不尝试使用Retina显示屏,所有内容在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];

我将视口大小设置如下:

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个回答

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接