OpenGL ES 1.1 iOS无法在视网膜和非视网膜上正确调整大小

时间:2013-03-05 16:48:50

标签: xcode opengl-es drawing coordinates

所以,我有一个非常奇怪的问题,我不知道为什么。在视网膜屏幕上显示以下opengl代码时,我收到以下图像: enter image description here

我在非视网膜上拍摄的图像如下: enter image description here

坐标系应该正常设置..我也注意到它通常不会扩展到视网膜大小。从[UIScreen mainscreen]获取帧时,我得到的视网膜和非视网膜的值相同,如下所示。有没有一种特殊的方式我想这个尺寸呢?

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

*编辑:原因是OpenGL ES 1.1本身不能扩展到Retina大小。创建ViewPort时,必须手动缩放大小,如glViewport(0,0,宽* [[UIScreen主屏幕]比例],高度* [[UIScreen主屏幕]比例]); 这是我能提出的最简单的方法。*

3 个答案:

答案 0 :(得分:2)

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

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

但是,增加像素数只会增加像素数。然后GL不会神奇地知道它应该扩展你所有的几何体(或者实际上那是你真正想要的)。如果你想对两个比例视图使用相同的几何(你通常会这样做),那么是的,你也负责应用比例。

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

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

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

答案 1 :(得分: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;
        }

答案 2 :(得分:0)

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

否则,如果您编写代码来检测视网膜设备并创建相应较大的视口,则将iOS的setContentScaleFactor设置为单独保留。