我正在尝试使用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);
}谢谢。
发布于 2013-06-10 00:35:44
OpenGL中的透明度依赖于顺序。算法存在于与顺序无关的透明性,但它们相当复杂,并且有一些严重的妥协。然而,在您的案例中,您可以使用alpha测试来解决这个问题的大部分。Alpha测试会忽略alpha低于某个阈值(示例中的空白区域)的像素。在谷歌上搜索确切的glAlphaFunc使用情况。
如果使用的是OpenGL ES 2.0,则内置alpha测试不可用,必须在着色器中实现它。它看起来像这样:
if (texture.alpha < 0.5)
{
discard;
}请注意,alpha测试可能会有一些严重的填充率性能折衷。
https://stackoverflow.com/questions/17011315
复制相似问题