2009-09-08 8 views
5

Quelqu'un sait comment créer une application OpenGL ES qui n'utilise pas les dimensions de l'écran de l'iPhone comme surface de dessin?Spécification d'une vue OpenGL ES non plein écran

Tout ce que j'ai vu a loin le EAGLView (ou autre) dessin à 0, 0, 320, 480.

Je voudrais avoir mon EAGLView à 100, 100, 100, 100. Est-ce possible? Il semble que tout ce que je dois faire est de changer l'appel de glviewport(), mais je ne suis pas sûr ... glViewport configure-t-il simplement un rectangle de découpage pour une vue OpenGL ES en plein écran? Ou est-ce que cela définit réellement l'origine (0, 0)?

C'est très déroutant, surtout quand vous essayez d'y penser en termes de UIViews, ce que je suis. Je voudrais passer un CGRect dans ma fonction initialize afin qu'il configure glViewport et tout le reste pour être dans ce rectangle.

Merci!

Répondre

6

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]; 
} 
+0

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

+0

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. –