2013-03-05 63 views
0

所以,我有一个相当奇怪的问题,我不知道为什么。当显示视网膜屏幕下面的OpenGL代码,我收到以下图片: enter image description hereOpenGL ES 1.1 iOS在视网膜和非视网膜上的尺寸不合适

,而我得到一个非视网膜上的图像是: 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本身并不扩展到视网膜的大小。在创建ViewPort时,您必须手动缩放大小,如glViewport(0,0,width * [[UIScreen mainScreen] scale],height * [[UIScreen mainScreen] scale]); 这是我能想出的最简单的方法。*

回答

2

OpenGL本身并不知道有关视图或屏幕特征的任何信息;它只知道像素。

默认情况下,与其他UIViews不同,GL支持的视图不会自动使用非1.0的缩放,而是以1x操作。正如你发现的那样,你应该设置屏幕比例来选择视网膜像素分辨率(这是两个尺寸的两倍)。

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

在ES 1.1(你似乎可以用,这就是:

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

在ES 2.0,你会应用此模型 - 视图或投影矩阵,然后您可以在使用顶点着色器来改变你的输入几何图形

+0

嗯,我并没有特别需要这样(它绝对可以缩放它,但我使用glViewport(0,0,width * [[UIScreen mainScreen] scale],height * [ [UIScreen mainScreen] scale]);编辑视口以缩放。我不喜欢这个想法,我必须手动乘以一个比例,但是会做什么。我只是在更深入地了解OpenGL ES 1.1。我知道我在ES 2.0中从来不用担心这个问题。所以不要再担心了。 – TheCodingArt 2013-03-06 17:41:52

0

我发现,显然需要设置正确调整视图视图中的“规模”的方法(如视图是基于位置而像素出于某种奇怪的原因,这些职位不会随着决议的增加而重新调整等)。这是我真正能找到的唯一的东西。我已经注意到在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; 
     } 
0

这是我使用setContentScaleFactor的方式 - 如果你是一个视网膜设备上,你只是想呈现给旧的非视网膜分辨率设置规模为1和iOS将增加一倍大小的给你。否则,如果您编写代码来检测视网膜设备并创建相应较大的视口,则将setContentScaleFactor设置为2以独立于iOS。

相关问题