所以,我有一个非常奇怪的问题,我不知道为什么。在视网膜屏幕上显示以下opengl代码时,我收到以下图像:
我在非视网膜上拍摄的图像如下:
坐标系应该正常设置..我也注意到它通常不会扩展到视网膜大小。从[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主屏幕]比例]); 这是我能提出的最简单的方法。*
答案 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设置为单独保留。