Подтвердить что ты не робот

OpenGL ES 2.0 GLKit с прозрачным фоном

Есть ли способ сделать фон GLKView прозрачным? Я пробовал решение здесь, но это не работает для меня.

* EDIT: Мне нужна помощь, чтобы сделать его полностью прозрачным. Фон в основном белый и серый, но я просто проверил его с более яркими цветами, и, конечно же, вы можете смутно видеть на заднем плане. Любые идеи, почему это будет частично прозрачным, но не полностью со следующим кодом?

Вот код в моем контроллере:

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

Я попытался установить backgroundColor для [UIColor clearColor] и установить, что eaglLayer не будет непрозрачным. Черт, я даже попытался установить backgroundColor eaglLayer на CGColorRef с 0 непрозрачностью.

4b9b3361

Ответ 1

Ну, я не думал, что это имеет значение, потому что альфа уже была на 0.0f, но когда я изменил

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

к

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

он сделал фон совершенно прозрачным.

Спасибо всем за ваши предложения и помощь!

Ответ 2

Для меня это помогло сделать представление непрозрачным:

view.opaque = NO

в дополнение к вызову glClearColor с прозрачностью, конечно.

Прозрачность 0.5f отлично смешивает фон над другим представлением UIImageview с половинной непрозрачностью.