2012-05-17 14 views
12

Gibt es eine Möglichkeit, den Hintergrund eines GLKView transparent zu machen? Ich habe die Lösung here versucht, aber das funktioniert nicht für mich.OpenGL ES 2.0 GLKit mit transparentem Hintergrund

* EDIT: Ich brauche Hilfe, damit es völlig transparent. Der Hintergrund ist größtenteils weiß und grau, aber ich habe es gerade mit kräftigeren Farben getestet, und tatsächlich kann man vage in den Hintergrund sehen. Irgendwelche Ideen, warum es teilweise transparent wäre, aber nicht vollständig mit dem folgenden Code?

Hier ist der Code in meinem View-Controller:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.context = [[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2] autorelease]; 
    CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.view.layer; 
    eaglLayer.opaque = NO; 

    if (!self.context) { 
     NSLog(@"Failed to create ES context"); 
    } 

    GLKView *view = (GLKView *)self.view; 
    view.context = self.context; 

    view.backgroundColor = [UIColor clearColor]; 

    view.drawableDepthFormat = GLKViewDrawableDepthFormat24; 

    [self setupGL]; 
} 

- (void)setupGL 
{ 
    [EAGLContext setCurrentContext:self.context]; 

    self.effect = [[[GLKBaseEffect alloc] init] autorelease]; 
    self.effect.light0.enabled = GL_FALSE; 
    self.effect.light0.diffuseColor = GLKVector4Make(1.0f, 0.4f, 0.4f, 0.0f); 
    self.effect.light0.ambientColor = GLKVector4Make(1.0f, 0.4f, 0.4f, 0.0f); 

    glDisable(GL_DEPTH_TEST); 

    glGenVertexArraysOES(1, &_vertexArray); 
    glBindVertexArrayOES(_vertexArray); 

    glGenBuffers(1, &_vertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_DYNAMIC_DRAW); 

    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glVertexAttribPointer(GLKVertexAttribPosition, VERTEX_POS_DATA_SIZE, GL_FLOAT, GL_FALSE, VERTEX_DATA_SIZE * sizeof(GLfloat), BUFFER_OFFSET(0)); 

    glEnableVertexAttribArray(GLKVertexAttribColor); 
    glVertexAttribPointer(GLKVertexAttribColor, VERTEX_COLOR_DATA_SIZE, GL_FLOAT, GL_FLOAT, VERTEX_DATA_SIZE * sizeof(GLfloat), BUFFER_OFFSET(VERTEX_POS_DATA_SIZE * sizeof(GLfloat)));  

    glLineWidth(10.0); 
} 

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect 
{ 
    if (!needsRedraw) return; 
    needsRedraw = NO; 

    glClearColor(0.65f, 0.65f, 0.65f, 0.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    [self.effect prepareToDraw]; 

    glDrawArrays(GL_LINE_STRIP, 0, vertexCount);  
} 

Ich habe versucht, die Backgroundcolor von der auf [UIColor Clear] Einstellung und die eaglLayer Einstellung nicht undurchsichtig. Verdammt, ich habe sogar versucht, die backgroundColor der eaglLayer auf CGColorRef mit 0 Opazität zu setzen.

+2

Sind Sie sicher, dass Sie den Szenenhintergrund zum Zeitpunkt des Malens der Szene nicht füllen? Ich weiß, dass es sich albern anhört, aber ich habe gesehen, dass das Leuten passiert ist, die versuchten, dasselbe zu tun. – mprivat

+0

Ich bin völlig neu damit, also ist es möglich, aber ich bin mir zu 99% sicher, dass ich nur den One-Line-Strip zeichne. Die klare Farbe wird auf ein Alpha von 0.0f gesetzt, aber ich habe sogar bemerkt, wenn ich versuche, Scheitelpunkte zu zeichnen, deren Farbattribute das Alpha auf 0.0f setzen, zeichnen sie trotzdem. Macht das einen Sinn/hilft Ihnen beim Brainstorming? – prplehaze

+3

Ein Kommentar, den ich hier machen könnte, ist, dass ich es vermeiden würde, eine nicht-opake OpenGL ES-Hosting-Ansicht zu verwenden, wenn du kannst. Dies wird das Rendering im Vergleich zu einer normalen opaken OpenGL ES-Ansicht drastisch verlangsamen. Wenn Sie können, ziehen Sie den Hintergrundinhalt, den Sie rendern möchten, in Ihre OpenGL ES-Szene und rendern Sie all das in eine undurchsichtige Ansicht. –

Antwort

15

Nun, ich hätte nicht gedacht, dies wäre egal, weil die Alpha bereits bei 0.0f war, aber als ich geändert

glClearColor(0.65f, 0.65f, 0.65f, 0.0f); 

zu

glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

machte es der Hintergrund vollkommen transparent.

Vielen Dank für Ihre Vorschläge und Hilfe!

+1

Ich sehe die gleiche Sache - es sei denn, die ClearColor ist nur Nullen, wird es nicht wirklich löschen, wie ich es erwarte. Schöner Fund! –

+4

das macht nur den Hintergrund schwarz, nicht transparent – zurbergram

+1

Es wird schwarz sein, es sei denn, Sie legen explizit die Layer-opaque-Eigenschaft der Ansicht auf NO fest, wie oben im Code-Snippet der Frage gezeigt. – tlbrack

6

Für mich half es den Blick nicht undurchsichtig zu machen:

view.opaque = NO 

neben dem glClearColor Anruf mit transparancy natürlich.

Eine Transparenz von 0,5 f verbindet den Hintergrund perfekt mit einem anderen UII-Bild mit halber Opazität.

Verwandte Themen