2013-03-05 88 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。

相關問題