Xcode OpenGL ES 1.1 iOS在视网膜上与非视网膜上的大小调整不当

Xcode OpenGL ES 1.1 iOS在视网膜上与非视网膜上的大小调整不当,xcode,opengl-es,drawing,coordinates,Xcode,Opengl Es,Drawing,Coordinates,所以,我有一个很奇怪的问题,我不知道为什么。在视网膜屏幕上显示以下opengl代码时,我收到以下图像: 我在非视网膜上得到的图像如下: 坐标系应正常设置。。我还注意到,它似乎一般不适合视网膜大小。当从[UIScreen mainscreen]获取帧时,我得到的视网膜和非视网膜的值相同,如下所示。我想有什么特别的方法来确定这个尺寸吗 frame: Origin: x:0.000000 y:0.000000, Size: width:768.000000 height:1024.000000

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

我在非视网膜上得到的图像如下:

坐标系应正常设置。。我还注意到,它似乎一般不适合视网膜大小。当从[UIScreen mainscreen]获取帧时,我得到的视网膜和非视网膜的值相同,如下所示。我想有什么特别的方法来确定这个尺寸吗

frame: Origin: x:0.000000 y:0.000000, Size: width:768.000000 height:1024.000000
*编辑:原因是OpenGL ES 1.1本身无法扩展到视网膜大小。创建视口时,必须手动缩放视口大小(0,0,宽度*[[UIScreen mainScreen]比例],高度*[[UIScreen mainScreen]比例]);
这是我能想到的最简单的方法。*

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

- (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;
        }

这就是我使用setContentScaleFactor的方式——如果您在视网膜设备上,您只想渲染到旧的非视网膜分辨率集,缩放到1,iOS将为您调整两倍的大小


否则,如果您编写代码来检测视网膜设备并创建相应较大的视口,请将ContentScaleFactor设置为2,以便iOS能够单独使用。

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

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

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

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

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

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

好吧,我并不特别需要这种方式(它确实可以缩放它。我使用了glViewport(0,0,宽度*[[UIScreen mainScreen]比例],高度*[[UIScreen mainScreen]比例]);编辑视口以进行缩放。我不喜欢必须手动乘以缩放的想法,但我会做什么。我只是回顾OpenGL ES 1.1以获得更深入的知识。我知道在ES 2.0中我从来没有担心过这一点。因此不再需要太多的担心。