我已经在iOS上编程OpenGL 4年了,ES2编程差不多2个。但是随着GLKit和Storyboards的加入,以及最新的Xcode,项目模板也不同了。并且不再有OpenGL模板创建EAGLView类。我不想使用GLKit。我更喜欢以编程方式做事。我尽量避免使用笔尖,我以前从未使用过故事板。但是在这种情况下,我将它们从模板中保留下来。
我的步骤:
我从一个新项目开始,然后选择单一视图应用程序。我运行它,它运行良好,白色屏幕。
接下来我去Build Phases并添加QuartzCore,OpenGLES。
然后我做New File并添加一个Objective-C类,使其成为UIView的子类并将其命名为EAGLView。在.h我导入和EAGLContext *上下文
在initWithFrame的.m中我添加了这个初始化代码......
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
eaglLayer.opaque = TRUE;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGB565, kEAGLDrawablePropertyColorFormat,
nil];
// Creates the EAGLContext and set it as the current one.
_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
if (!_context || ![EAGLContext setCurrentContext:_context])
{
NSLog(@"_context no workie!");
return nil;
}
在我的ViewController.h中,我添加了@class EAGLView;
和一个属性EAGLView *glView;
在viewDidLoad的ViewController.m中,我添加:
CGRect rect = [[UIScreen mainScreen] applicationFrame];
int width=rect.size.width;
int height=rect.size.height;
glView = [[EAGLView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
if([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
glView.contentScaleFactor = [[UIScreen mainScreen] scale];
}
glView.contentMode = UIViewContentModeScaleToFill;
self.view = glView;
然后我跑了。我收到此错误消息:
-[CALayer setDrawableProperties:]: unrecognized selector sent to instance 0x8e441c0
我的CAEAGLLayer eaglLayer如何没有.drawableProperties的选择器?我错过了某个地方的一步吗?
*更新*
我找到了这个解决方案:
在EAGLView.m中,我添加了以下内容:
+ (Class) layerClass
{
return [CAEAGLLayer class];
}
现在它运行没有崩溃。谁能告诉我为什么需要它?
答案 0 :(得分:2)
您始终需要覆盖此方法。似乎默认图层类是CALayer
,它没有setDrawableProperties:
方法。您可以看到CAEAGLLayer
是CALayer
的子类。
沿着管道的某个地方叫做
[[[self class] layerClass] performSelector:@selector(setDrawableProperties:) withObject:properties];
在没有覆盖layerClass
方法的情况下生成异常。
答案 1 :(得分:0)
OpenGL只能在[CAEAGLayer类]和
上使用 + (Class) layerClass
{
return [CAEAGLLayer class];
}
此视图的平均层是CAEAGLayer。