Ios GLKit和透明度

Ios GLKit和透明度,ios,glkit,Ios,Glkit,我正在尝试使用OpenGL ES和GLKit绘制类似的东西 但我明白了 虽然纹理是透明的,但模型的上层将替换下的纹理,而不是混合。有可能以某种方式修复它吗 - (void)setup { self.effect = [[GLKBaseEffect alloc] init]; NSURL *textureURL = [[NSBundle mainBundle] URLForResource:@"portalTexture_ALIENS" withExtension:@"pn

我正在尝试使用OpenGL ES和GLKit绘制类似的东西

但我明白了

虽然纹理是透明的,但模型的上层将替换下的纹理,而不是混合。有可能以某种方式修复它吗

- (void)setup {

    self.effect = [[GLKBaseEffect alloc] init];

    NSURL *textureURL = [[NSBundle mainBundle] URLForResource:@"portalTexture_ALIENS" withExtension:@"png"];
    texture = [GLKTextureLoader textureWithContentsOfURL:textureURL options:nil error:nil];

    if (texture != nil) {
        self.effect.texture2d0.enabled = GL_TRUE;
        self.effect.texture2d0.envMode = GLKTextureEnvModeReplace;
        self.effect.texture2d0.target = GLKTextureTarget2D;
        self.effect.texture2d0.name = texture.name;
    }

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, texturedPortalVerts);
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, texturedPortalTexCoords);

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

}

- (void)draw {
    [self.effect prepareToDraw];
    glDrawArrays(GL_TRIANGLES, 0, texturedPortalNumVerts);
}

谢谢。

OpenGL中的透明度取决于顺序。存在与顺序无关的透明算法,但它们相当复杂,存在一些严重的折衷。然而,在您的情况下,您可以使用alpha测试来解决大部分问题。Alpha测试忽略Alpha低于某个阈值(示例中的空白)的像素。谷歌它的确切使用glAlphaFunc

如果您使用的是OpenGL ES 2.0,则内置alpha测试不可用,您必须在着色器中实现它。它看起来像这样:

if (texture.alpha < 0.5)
{
    discard;
}
if(texture.alpha<0.5)
{
丢弃;
}
请注意,alpha测试可能会有一些严重的填充率性能问题