Iphone Xcode 4 OpenGL ES 1.1模板
我从xcode 4启动了一个新的opengles项目,并删除了所有ES2引用和调用(我想使用ES1绘图代码)。我的示例项目在iPhone4上运行良好,但在iPhone3G和iPod2代上不起作用。Hre是我修改过的代码: 伊格尔维Iphone Xcode 4 OpenGL ES 1.1模板,iphone,opengl-es,xcode4,Iphone,Opengl Es,Xcode4,我从xcode 4启动了一个新的opengles项目,并删除了所有ES2引用和调用(我想使用ES1绘图代码)。我的示例项目在iPhone4上运行良好,但在iPhone3G和iPod2代上不起作用。Hre是我修改过的代码: 伊格尔维 #import <QuartzCore/QuartzCore.h> #import "EAGLView.h" @interface EAGLView (PrivateMethods) - (void)createFramebuffer; - (void
#import <QuartzCore/QuartzCore.h>
#import "EAGLView.h"
@interface EAGLView (PrivateMethods)
- (void)createFramebuffer;
- (void)deleteFramebuffer;
@end
@implementation EAGLView
@synthesize context;
// You must implement this method
+ (Class)layerClass
{
return [CAEAGLLayer class];
}
//The EAGL view is stored in the nib file. When it's unarchived it's sent -initWithCoder:.
- (id)initWithCoder:(NSCoder*)coder
{
self = [super initWithCoder:coder];
if (self) {
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
eaglLayer.opaque = TRUE;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
nil];
}
return self;
}
- (void)dealloc
{
[self deleteFramebuffer];
[context release];
[super dealloc];
}
- (void)setContext:(EAGLContext *)newContext
{
if (context != newContext) {
[self deleteFramebuffer];
[context release];
context = [newContext retain];
[EAGLContext setCurrentContext:nil];
}
}
- (void)createFramebuffer
{
if (context && !defaultFramebuffer) {
[EAGLContext setCurrentContext:context];
// Create default framebuffer object.
glGenFramebuffersOES(1, &defaultFramebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
// Create color render buffer and allocate backing store.
glGenRenderbuffersOES(1, &colorRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer *)self.layer];
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &framebufferWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &framebufferHeight);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);
if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
}
}
- (void)deleteFramebuffer
{
if (context) {
[EAGLContext setCurrentContext:context];
if (defaultFramebuffer) {
glDeleteFramebuffersOES(1, &defaultFramebuffer);
defaultFramebuffer = 0;
}
if (colorRenderbuffer) {
glDeleteRenderbuffersOES(1, &colorRenderbuffer);
colorRenderbuffer = 0;
}
}
}
- (void)setFramebuffer
{
if (context) {
[EAGLContext setCurrentContext:context];
if (!defaultFramebuffer)
[self createFramebuffer];
glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
glViewport(0, 0, framebufferWidth, framebufferHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0, framebufferWidth, framebufferHeight, 0, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
}
- (BOOL)presentFramebuffer
{
BOOL success = FALSE;
if (context) {
[EAGLContext setCurrentContext:context];
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
success = [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
return success;
}
- (void)layoutSubviews
{
// The framebuffer will be re-created at the beginning of the next setFramebuffer method call.
[self deleteFramebuffer];
}
@end
基于此项目计划,本应适用于opengles 1.1设备,但不适用(此代码仅适用于iphone4)!
这里出了什么问题?请帮帮我。谢谢。一个问题是CADisplayLink在3.1之前的IOS版本中不存在。您可以在awakeFromNib中这样检测:
NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
mDisplayLinkSupported = TRUE;
if (mAnimating)
{
if (mDisplayLinkSupported)
{
[mDisplayLink invalidate];
mDisplayLink = nil;
}
else
{
[mAnimationTimer invalidate];
mAnimationTimer = nil;
}
mAnimating = FALSE;
}
然后在startAnimation中,你可以这样做
if (mDisplayLinkSupported)
{
// CADisplayLink is API new to iPhone SDK 3.1. Compiling against earlier versions will result in a warning, but can be dismissed
// if the system version runtime check for CADisplayLink exists in -initWithCoder:. The runtime check ensures this code will
// not be called in system versions earlier than 3.1.
mDisplayLink = [NSClassFromString(@"CADisplayLink") displayLinkWithTarget:self selector:@selector(drawView:)];
[mDisplayLink setFrameInterval:1];
[mDisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}
else
mAnimationTimer = [NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval)(1.0 / 60.0) target:self selector:@selector(drawView:) userInfo:nil repeats:TRUE];
在stopAnimation中,执行以下操作:
NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
mDisplayLinkSupported = TRUE;
if (mAnimating)
{
if (mDisplayLinkSupported)
{
[mDisplayLink invalidate];
mDisplayLink = nil;
}
else
{
[mAnimationTimer invalidate];
mAnimationTimer = nil;
}
mAnimating = FALSE;
}
您还需要使drawFrame的签名看起来像这样,以便它能够处理AnimationTimer消息
- (void) drawFrame:(id)sender
无论如何,这段代码并没有使用与您相同的变量名,因为我只是从代码中复制了它,但您可以理解其中的要点。顺便说一句,这段代码源自一个旧的XCode模板,该模板考虑了不支持显示链接的旧IOS版本。问题可能在于视图文件。您必须将其设置为默认的GLES 1,而不是大多数情况下默认的GLES 2。它可能会有类似于
if ((self = [super initWithCoder:coder]))
{
// Get the layer
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
eaglLayer.opaque = TRUE;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
renderer = [[ES2Renderer alloc] init];
if (!renderer)
{
renderer = [[ES1Renderer alloc] init];
if (!renderer)
{
[self release];
return nil;
}
}
只需更换ES2Renderer和ES1Renderer即可。据说所有这些东西都可以创建eLayer,然后将ES2设置为默认值,如果无法加载ES2,则使用ES1会出现什么错误?3g和ipod第二代上的背景屏幕颜色为紫色。背景纹理有多大?我认为这个设备的最大尺寸是1024x1024@Bastian谢谢你的回复。我不使用任何纹理作为背景。这是一个有效的观点,但你今天几乎找不到3.0设备。所有旧设备都得到了3.1.3更新,并且从3.0开始支持CADisplayLink。如果问题出在没有粉色屏幕的情况下,应用程序将无法启动。我不认为现在支持3.0是没有意义的。不,CADisplayLink是在3.1版本中首次提供的。你会惊讶有多少人还在运行iOS 3.0。如果你能用一点努力来支持它:去做吧!哦,是的,关于粉色屏幕的观点很好。直到我发完帖子,我才看到那个花边新闻@贾斯蒂德:我想我不会感到惊讶的。从我们市场上的免费游戏来看,约11%的下载来自ios 3.x,89%的下载来自ios 4.x。从这11%的总下载量来看,80%是3.1.3,17%是3.1.2。只有0.22%的下载者仍然拥有3.0。。