⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glview.m

📁 simpe empty opengl application project for iphone
💻 M
字号:
////  GLView.m//  ___PROJECTNAME___////  Created by ___FULLUSERNAME___ on ___DATE___.//  Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved.//#import <QuartzCore/QuartzCore.h>#import <OpenGLES/EAGLDrawable.h>#import "GLView.h"#import "GLViewController.h"@interface GLView (private)- (id)initGLES;- (BOOL)createFramebuffer;- (void)destroyFramebuffer;@end@implementation GLView@synthesize animationInterval;+ (Class) layerClass{	return [CAEAGLLayer class];}-(id)initWithFrame:(CGRect)frame{	self = [super initWithFrame:frame];	if(self != nil)	{		self = [self initGLES];	}	return self;}- (id)initWithCoder:(NSCoder*)coder{	if((self = [super initWithCoder:coder]))	{		self = [self initGLES];	}		return self;}-(id)initGLES{	CAEAGLLayer *eaglLayer = (CAEAGLLayer*) self.layer;		// Configure it so that it is opaque, does not retain the contents of the backbuffer when displayed, and uses RGBA8888 color.	eaglLayer.opaque = YES;	eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:										[NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking,										kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,										nil];		// Create our EAGLContext, and if successful make it current and create our framebuffer.	context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];	if(!context || ![EAGLContext setCurrentContext:context] || ![self createFramebuffer])	{		[self release];		return nil;	}		// Default the animation interval to 1/60th of a second.	animationInterval = 1.0 / kRenderingFrequency;	return self;}-(GLViewController *)controller{	return controller;}-(void)setController:(GLViewController *)d{	controller = d;	controllerSetup = ![controller respondsToSelector:@selector(setupView:)];}// If our view is resized, we'll be asked to layout subviews.// This is the perfect opportunity to also update the framebuffer so that it is// the same size as our display area.-(void)layoutSubviews{	[EAGLContext setCurrentContext:context];	[self destroyFramebuffer];	[self createFramebuffer];	[self drawView];}- (BOOL)createFramebuffer{	// Generate IDs for a framebuffer object and a color renderbuffer	glGenFramebuffersOES(1, &viewFramebuffer);	glGenRenderbuffersOES(1, &viewRenderbuffer);		glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);	glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);	// This call associates the storage for the current render buffer with the EAGLDrawable (our CAEAGLLayer)	// allowing us to draw into a buffer that will later be rendered to screen whereever the layer is (which corresponds with our view).	[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(id<EAGLDrawable>)self.layer];	glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);		glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);	glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);		// For this sample, we also need a depth buffer, so we'll create and attach one via another renderbuffer.	glGenRenderbuffersOES(1, &depthRenderbuffer);	glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);	glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);	glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);	if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)	{		NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));		return NO;	}		return YES;}// Clean up any buffers we have allocated.- (void)destroyFramebuffer{	glDeleteFramebuffersOES(1, &viewFramebuffer);	viewFramebuffer = 0;	glDeleteRenderbuffersOES(1, &viewRenderbuffer);	viewRenderbuffer = 0;		if(depthRenderbuffer)	{		glDeleteRenderbuffersOES(1, &depthRenderbuffer);		depthRenderbuffer = 0;	}}- (void)startAnimation{	animationTimer = [NSTimer scheduledTimerWithTimeInterval:animationInterval target:self selector:@selector(drawView) userInfo:nil repeats:YES];}- (void)stopAnimation{	[animationTimer invalidate];	animationTimer = nil;}- (void)setAnimationInterval:(NSTimeInterval)interval{	animationInterval = interval;		if(animationTimer)	{		[self stopAnimation];		[self startAnimation];	}}// Updates the OpenGL view when the timer fires- (void)drawView{	// Make sure that you are drawing to the current context	[EAGLContext setCurrentContext:context];		// If our drawing delegate needs to have the view setup, then call -setupView: and flag that it won't need to be called again.	if(!controllerSetup)	{		[controller setupView:self];		controllerSetup = YES;	}		glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);	[controller drawView:self];		glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);	[context presentRenderbuffer:GL_RENDERBUFFER_OES];		GLenum err = glGetError();	if(err)		NSLog(@"%x error", err);}// Stop animating and release resources when they are no longer needed.- (void)dealloc{	[self stopAnimation];		if([EAGLContext currentContext] == context)	{		[EAGLContext setCurrentContext:nil];	}		[context release];	context = nil;		[super dealloc];}@end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -