Tout ce que vous devez faire est d'appeler [super initWithFrame: frame] avec le cadre que vous voulez dans votre classe EAGLView lorsque vous l'initiez. Cet exemple créera une vue OpenGL transparente dans le coin supérieur gauche et l'ajoutera à la vue des contrôleurs.
J'ai le code suivant dans ma 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;
}
Et puis je crée le EAGLView de mon contrôleur comme ceci:
theEAGLView = [[EAGLView alloc] initWithFrame:CGRectMake(30.0f, 30.0f,
90.0f, 70.0f)];
theEAGLView.opaque = NO;
[self.view addSubview:theEAGLView];
Le code qui réalise le dessin en ma classe EAGLView est appelée à partir du contrôleur et va quelque chose comme ceci:
- (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];
}
C'est super - merci. Je suis encore confus cependant sur pourquoi vous le feriez: glViewport (0, 0, backingWidth, backingHeight); glOrthof (0.0f, backingWidth, 0.0f, hauteur d'appui, 1000.0f, -1000.0f); Lorsque la largeur et la hauteur sont définies sur 320x480, votre surface de dessin (l'EAGLView) n'est plus en plein écran. Quelle est la relation entre glViewport() et le CGRect de l'EAGLView? Ou est-ce complètement arbitraire? Toujours dans l'appel glOrtho(), ne voudriez-vous pas passer de 0 à votre largeur maximale dans EAGLView, plutôt que de 0 à 320? Merci pour votre aide! – yozzozo
backingWidth et backingHeight de EAGLView seront définis à partir de la taille du CGRect utilisé lors de l'initialisation de EAGLView. Donc, dans cet exemple, ils auront tous les deux 30 ans. –