0

所以,我遇到了一个很奇怪的问题,我不知道为什么。在视网膜屏幕上显示以下 opengl 代码时,我收到以下图像: 在此处输入图像描述

而我在非视网膜上得到的图像如下: 在此处输入图像描述

坐标系应该正常设置。我还注意到它似乎通常不会缩放到视网膜大小。从 [UIScreen 主屏幕] 获取框架时,我得到的视网膜和非的值相同,如下所示。我想有一种特殊的方法来调整这个大小吗?

frame: Origin: x:0.000000 y:0.000000, Size: width:768.000000 height:1024.000000

*编辑:原因是 OpenGL ES 1.1 本身不能缩放到 Retina 大小。创建 ViewPort 时,您必须手动缩放大小,例如 glViewport(0, 0, width * [[UIScreen mainScreen] scale], height * [[UIScreen mainScreen] scale]); 这是我能想到的最简单的方法。*

4

3 回答 3

2

OpenGL 本身对视图或屏幕特性一无所知;它只知道像素。

默认情况下,与其他 UIView 不同,GL 支持的视图不会自动使用非 1.0 比例,而是以 1x 操作。因此,正如您所发现的,您应该将屏幕比例设置为选择视网膜像素分辨率(两个维度的大小都是 2 倍)。

然而,增加像素的数量只会增加像素的数量。GL 并不神奇地知道它应该缩放所有几何体(或者实际上这就是你真正想要的)。如果您想为两个比例视图使用相同的几何图形(您通常会这样做),那么是的,您还负责应用比例。

在 ES 1.1 中(您似乎正在使用,这只是:

glScalef([UIScreen mainScreen] scale], [UIScreen mainScreen] scale], 1.0);

在 ES 2.0 中,您可以将其应用于模型视图或投影矩阵,然后在顶点着色器中使用它来转换输入几何体。

于 2013-03-06T02:46:07.740 回答
0

我发现视图的“缩放”方法显然需要设置为正确调整视图大小(因为视图是基于位置的而不是像素,并且由于某些奇怪的原因,位置不会随着分辨率的提高等而调整)。这是我唯一能真正找到的东西。我注意到在 GLView 的 init 方法中包含以下调用检查和设置...但我仍然想知道是否有更好的方法。我不是必须通过将高度和宽度乘以 scale 属性来手动调整所有内容的大小吗?

- (id)initWithFrame:(CGRect)frame
{

    NSLog(@"frame: Origin: x:%f y:%f, Size: width:%f height:%f", frame.origin.x, frame.origin.y, frame.size.width, frame.size.height);

    self = [super initWithFrame:frame];
    if (self) {

        **if([[UIScreen mainScreen] respondsToSelector: NSSelectorFromString(@"scale")])
        {
            if([self respondsToSelector: NSSelectorFromString(@"contentScaleFactor")])
            {
                [self setContentScaleFactor:[[UIScreen mainScreen] scale]];
                NSLog(@"Scale factor: %f", [[UIScreen mainScreen] scale]);
            }
        }**

        NSLog(@"frame: Origin: x:%f y:%f, Size: width:%f height:%f Scale factor: %f", frame.origin.x, frame.origin.y, frame.size.width, frame.size.height, self.contentScaleFactor);
        CAEAGLLayer *eaglLayer = (CAEAGLLayer *)super.layer;
        eaglLayer.opaque = YES; // set to indicate that you do not need Quartz to handle transparency. This is a performance benefit.

        context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

        if (!context || ![EAGLContext setCurrentContext:context]) {
            return nil;
        }
于 2013-03-06T00:55:50.073 回答
0

这就是我使用 setContentScaleFactor 的方式——如果你在视网膜设备上,并且你只想渲染到旧的非视网膜分辨率设置,缩放为 1,iOS 会为你加倍大小。

否则,如果您编写代码来检测 Retina 设备并创建相应更大的视口,请将内容缩放因子设置为 2 以由 iOS 单独保留。

于 2013-03-06T02:30:00.350 回答