2009-09-08 14 views
5

Qualcuno sa come creare un'app OpenGL ES che non utilizza le dimensioni dello schermo dell'iPhone completo come superficie di disegno?Specifica di una vista ES OpenGL non a schermo intero

Tutto quello che ho visto finora è l'EAGLView (o qualsiasi altra cosa) disegno a 0, 0, 320, 480.

mi piacerebbe avere il mio EAGLView a 100, 100, 100, 100. È possibile? Sembra che tutto quello che dovrei fare è cambiare la chiamata a glViewport(), ma non è sicuro ... glViewport semplicemente imposta un rettangolo di ritaglio per una vista OpenGL ES a schermo intero? O in realtà definisce dove si trova l'origine (0, 0)?

È molto confuso, soprattutto quando stai cercando di pensarci in termini di UIViews, che io sono. Mi piacerebbe passare un CGRect alla mia funzione di inizializzazione in modo che configuri glViewport e tutto il resto in quel rettangolo.

Grazie!

risposta

6

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

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

+0

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