2012-05-17 17 views
12

¿Hay alguna manera de hacer transparente el fondo de un GLKView? He intentado la solución here pero eso no funciona para mí.OpenGL ES 2.0 GLKit con fondo transparente

* EDIT: Necesito ayuda para que sea completamente transparente. El fondo es en su mayoría blanco y gris, pero acabo de probarlo con colores más vivos y, por supuesto, puede ver vagamente hasta el fondo. ¿Alguna idea de por qué sería parcialmente transparente pero no completamente con el siguiente código?

Aquí está el código en mi controlador de vista:

- (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);  
} 

He tratado de establecer la backgroundColor del a [UIColor clearColor] y ajuste de la eaglLayer a no ser opaco. Diablos, incluso intenté establecer el backgroundColor de eaglLayer en CGColorRef con 0 opacidad.

+2

¿Estás seguro de que no estás rellenando el fondo de la escena en el momento de pintar la escena? Sé que suena tonto, pero he visto que le sucede a personas que intentaban hacer lo mismo. – mprivat

+0

Soy completamente nuevo con esto, por lo que es posible, pero estoy 99% seguro de que solo estoy dibujando la tira de una línea. El color claro está configurado para tener un alfa de 0.0f, pero incluso he notado que si intento dibujar vértices cuyos atributos de color establecen el alfa en 0.0f, aún dibujan. ¿Tiene sentido o te ayuda a hacer una lluvia de ideas? – prplehaze

+3

Un comentario que podría hacer aquí es que evitaría usar una vista de alojamiento de OpenGL ES no opaca si puede. Esto ralentizará dramáticamente su renderizado en comparación con una vista opacidad normal de OpenGL ES. Si puede, extraiga el contenido de fondo que desea procesar dentro de su escena OpenGL ES y visualice todo eso en una vista opaca. –

Respuesta

15

Bueno, yo no creo que esto tendría importancia porque el alfa ya estaba en 0.0f, pero cuando cambié

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

a

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

que hizo el fondo perfectamente transparente.

Gracias a todos por sus sugerencias y ayuda!

+1

Estoy viendo lo mismo, a menos que clearColor sea todo ceros, en realidad no se borrará de la manera que espero. Buen hallazgo! –

+4

esto solo hace que el fondo sea negro, no transparente – zurbergram

+1

Será negro a menos que establezca explícitamente la propiedad opaca de la capa de la vista en NO como se muestra arriba en el fragmento de código de la pregunta. – tlbrack

6

Para mí ayudado a hacer la vista no opaca:

view.opaque = NO 

además de la llamada glClearColor con máxima transparencia por supuesto.

Una transparencia de 0.5f combina perfectamente el fondo con otro UIImageview con media opacidad.