2016-03-20 21 views
-1

Ich versuche ein OpenGL-Projekt für iOS zu erstellen, aber glViewport kann nicht daran arbeiten.glViewport funktioniert nicht unter iOS

Schauen Sie das einfache Codebeispiel:

- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 

    EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 
    [EAGLContext setCurrentContext:context]; 

    const CGRect frame = [[UIScreen mainScreen] bounds]; 

    //GLKView *glView = [[GLKView alloc] initWithFrame:CGRectMake(100, 100, 300, 300)]; 
    GLKView* glView = [[GLKView alloc] initWithFrame:frame context:context]; 
    [self.view addSubview:glView]; 

    GLuint renderbuffer; 
    glGenRenderbuffers(1, &renderbuffer); 
    glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer); 
    [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)glView.layer]; 

    GLuint framebuffer; 
    glGenFramebuffers(1, &framebuffer); 
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer); 

    // Set the viewport 
    glViewport(100, 100, 300, 300); 

    // Clear 
    glClearColor(1, 0, 0, 1); 
    glClear(GL_COLOR_BUFFER_BIT); 

    // Present renderbuffer 
    [context presentRenderbuffer:GL_RENDERBUFFER]; 
} 

Änderungen ich in glViewport tue don `t irgendwelche Effekte machen.

Aber wenn ich "initWithFrame: CGRectMake (100, 100, 300, 300)" hinzufügen, wird es funktionieren, aber ich brauche wirklich glViewport.

Was mache ich falsch?

Antwort

0

glClear berücksichtigt nicht das aktuelle Ansichtsfenster. Wenn Sie eine zu löschende Unterregion auswählen möchten, müssen Sie mit glScissor aktivieren und dann das Scissoring mit glEnable(GL_SCISSOR_TEST) aktivieren.

+0

Danke, es hat funktioniert, was ich brauche. Aber was ist der wirkliche Vorschlag von glViewport? Wenn ich es kommentiere, wird sich im Bildschirm nichts ändern. –

+0

@ EduardoDória: 'glViewport' wirkt sich auf Grundelemente aus, die Sie rendern: Dreiecke, Linien usw. Bei der Operation" Löschen "werden keine Grundelemente dargestellt. –

0

Ich machte mehr Untersuchungen und testete, dass glViewport auf jedem Rahmen aufgerufen werden sollte, wenn GLKView verwendet, um OpenGL-Umgebung zu erstellen.

Um zu sehen, wie glViewport wie gewohnt funktioniert, wird reines EAGLView benötigt.

fand ich das in diesem Thread geantwortet: glViewport different result in Android and iOS

Verwandte Themen