OpenGL ES 2.0 GLKit带有透明背景

13
有没有方法可以使 GLKView 的背景透明?我已经尝试了这里提供的解决方案,但对我不起作用。
*编辑:我需要帮助将其完全透明化。背景大部分是白色和灰色,但我刚刚测试了更鲜艳的颜色,果然你可以隐约看到背景。为什么会部分透明而不是用以下代码完全透明?
以下是我的视图控制器中的代码:
- (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 不透明。甚至我还尝试将 eaglLayer 的 backgroundColor 设置为 CGColorRef 且透明度为 0。


2
你确定在绘制场景时没有填充场景背景吗?我知道这听起来很傻,但我见过有人试图做同样的事情时发生了这种情况。 - mprivat
我对这个完全是新手,所以有可能,但我99%确定我只画了一条线。清除颜色设置为alpha为0.0f,但我甚至注意到,如果我尝试绘制顶点,其颜色属性将alpha设置为0.0f,它们仍然会被绘制。这有任何意义/能帮助你头脑风暴吗? - prplehaze
3
这里我想说的是,如果可能的话,应该避免使用一个非不透明的OpenGL ES宿主视图。相比于一个普通的不透明的OpenGL ES视图,这会极大地减慢你的渲染速度。如果可以的话,在你的OpenGL ES场景中将你想要渲染的背景内容拉到内部,并将所有内容都渲染在一个不透明的视图上。 - Brad Larson
Brad,我真的尽力想出创意来避免这个问题,但是我无法想到一个透明度的解决方法。我有一个带有动态内容的视图,用户可以拖放,我需要GLKView让他们绘制。即使截屏并将其用作背景也不起作用,因为一旦他们关闭绘图,绘图需要保留,但下面的内容是动态的。我只渲染线条,所以在渲染方面没有太大压力。有什么想法吗?具有讽刺意味的是,实际上是你在cocoaconf的演讲让我决定尝试OpenGL。没有压力 :) - prplehaze
是的,这可能是你在这里唯一的选择。有时候,这是不可避免的。对于放置在用户界面元素上方的2D图形绘制,你甚至可能不会注意到减速。只有当你进行更强烈的渲染时才会变得显而易见。最坏的情况下,试一试看看效果。这只是在分析时要注意的事项。 - Brad Larson
2个回答

18

虽然我认为这没什么关系,因为 alpha 已经是 0.0f 了,但当我改变了它时

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

为了

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

它可以完美地将背景变成透明的。

感谢大家的建议和帮助!


1
我也发现了同样的问题 - 除非clearColor全是零,否则它不会按照我的期望进行擦除。很好的发现! - John Stephen
4
这只会让背景变黑,而不是透明。 - zurbergram
1
除非您在问题的代码片段中如上所示明确设置视图的层不透明属性为NO,否则它将是黑色的。 - tlbrack
6
要清楚,您需要:opaque = NObackgroundColor = [UIColor clearColor]glClearColor(0, 0, 0, 0) - Ephemera
1
尝试在IE构建器中将不透明属性设置为NO,但是无效 - 只能在代码中实现。有人知道可能的问题吗? - vir us

6

对我来说,将视图设置为不透明很有帮助:

view.opaque = NO

除了带有透明度的glClearColor调用外。

0.5f的透明度可以完美地将背景与另一个半透明的UIImageview混合在一起。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接