Tutto ciò che devi fare è chiamare [super initWithFrame: frame] con il frame che desideri dalla classe EAGLView quando lo avvii. Questo esempio creerà una vista OpenGL trasparente nell'angolo in alto a sinistra e la aggiungerà alla visualizzazione dei controller.
Ho il seguente codice nella mia classe EAGLView:
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
// get the layer
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
eaglLayer.opaque = NO;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO],
kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGBA8,
kEAGLDrawablePropertyColorFormat,
nil];
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
if (!context || ![EAGLContext setCurrentContext:context]) {
[self release];
return nil;
}
[EAGLContext setCurrentContext:context];
[self destroyFramebuffer];
[self createFramebuffer];
}
return self;
}
E poi creo l'EAGLView dal mio controller in questo modo:
theEAGLView = [[EAGLView alloc] initWithFrame:CGRectMake(30.0f, 30.0f,
90.0f, 70.0f)];
theEAGLView.opaque = NO;
[self.view addSubview:theEAGLView];
Il codice che fa il disegno reale la mia classe EAGLView viene chiamata dal controller e va in questo modo:
- (void)render {
glViewport(0, 0, backingWidth, backingHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0.0f, backingWidth, 0.0f, backingHeight, 1000.0f, -1000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
// this is where we draw our stuff
// ...
// ...
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
fonte
2009-09-08 09:05:52
Questo è fantastico - grazie. Sono ancora confuso sul perché si dovrebbe fare questo: glViewport (0, 0, backingWidth, backingHeight); glOrthof (0.0f, backingWidth, 0.0f, backingHeight, 1000.0f, -1000.0f); Quando backingWidth e height sono impostati su 320x480 e la superficie del disegno (EAGLView) non è più a schermo intero. Qual è la relazione tra glViewport() e CGRect di EAGLView? O è completamente arbitrario? Anche nella chiamata glOrtho(), non vuoi passare da 0 alla larghezza massima in EAGLView, piuttosto che da 0 a 320? Grazie per l'aiuto! – yozzozo
Il backingWidth e il backingHeight di EAGLView verranno impostati dalle dimensioni del CGRect utilizzato durante l'inizializzazione di EAGLView. Quindi in questo esempio saranno entrambi 30. –