2009-09-08 11 views
5

Czy ktoś wie, jak utworzyć aplikację OpenGL ES, która nie wykorzystuje pełnych wymiarów ekranu iPhone'a jako powierzchni rysunkowej?Określanie widoku w trybie pełnoekranowym OpenGL ES

Wszystko widziałem do tej pory ma EAGLView (lub cokolwiek) rysunek do 0, 0, 320, 480.

Chciałbym mieć mój EAGLView 100, 100, 100, 100. czy to możliwe? Wydaje mi się, że wystarczy tylko zmienić wywołanie glViewport(), ale nie jestem pewien ... czy glViewport po prostu ustawił prostokąt przycinający do widoku OpenGL ES w trybie pełnoekranowym? Czy rzeczywiście określa miejsce pochodzenia (0, 0)?

To bardzo mylące, zwłaszcza gdy próbujesz myśleć o tym w kategoriach UIViews, którymi jestem. Chciałbym przekazać CGRect do mojej funkcji initialize, aby ustawić glViewport i wszystko inne w tym prostokącie.

Dzięki!

Odpowiedz

6

Wszystko, co musisz zrobić, to wywołać [super initWithFrame: frame] z ramką, którą chcesz z klasy EAGLView, gdy ją zainicjujesz. Ten przykład utworzy przezroczysty widok OpenGL w lewym górnym rogu i doda go do widoku kontrolerów.

Mam następujący kod w mojej klasie 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; 
} 

I wtedy utworzyć EAGLView z mojego kontrolera tak:

theEAGLView = [[EAGLView alloc] initWithFrame:CGRectMake(30.0f, 30.0f, 
                 90.0f, 70.0f)]; 
theEAGLView.opaque = NO; 
[self.view addSubview:theEAGLView]; 

Kod, który ma rzeczywistą rysunku w moja klasa EAGLView jest wywoływana ze sterownika i wygląda następująco:

- (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

To jest wspaniałe - dzięki. Nadal jestem zdezorientowany, ale dlaczego to zrobiłeś: glViewport (0, 0, backingWidth, backingHeight); glOrthof (0,0f, backingWidth, 0,0f, backingHeight, 1000,0f, -1000,0f); Podczas tworzenia kopii zapasowej szerokość i wysokość są ustawione na 320 x 480, a powierzchnia rysowania (EAGLView) nie jest już pełnoekranowa. Jaki jest związek między glViewport() i CGRect z EAGLView? Czy jest to całkowicie arbitralne? Również w wywołaniu glOrtho(), czy nie chcesz po prostu przejść od 0 do maksymalnej szerokości w EAGLView, a nie od 0 do 320? Dzięki za pomoc! – yozzozo

+0

BackingWidth i backingHeight EAGLView zostanie ustawiony na podstawie rozmiaru CGRect używanego podczas inicjowania EAGLView. W tym przykładzie oba będą mieć 30. –