我使用以下链接获取在iOS中绘制3D立方体的源代码。
http://www.raywenderlich.com/5235/beginning-opengl-es-2-0-with-glkit-part-2
以下是我的更新例程的代码段:
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
glClearColor(30/255.0, 30/255.0, 30/255.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
// Enable transparency
//glEnable(GL_BLEND);
//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
[[self effect] prepareToDraw];
glBindVertexArrayOES(_vertexArray);
glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0);
// Cleanup: Done with the current blend function
//glDisable(GL_BLEND);
}
我正在尝试创建一个具有透明度的纹理的立方体,并最终绘制底层面。我附上了我的实际纹理。它现在看起来像是一个立方体,显示所有没有透明度的面,显示底层面。如果我取消注释混合例程,它会绘制一个透明的立方体,它在背景上混合,但是其他面部。
以下是我加载纹理的部分内容:
_effect = [[GLKBaseEffect alloc] init];
NSDictionary * options = @{ GLKTextureLoaderOriginBottomLeft: @YES };
NSError *error;
NSString *path = [[NSBundle mainBundle] pathForResource:@"Texture200x200" ofType:@"png"];
GLKTextureInfo *info = [GLKTextureLoader textureWithContentsOfFile:path options:options error:&error];
if (info == nil) {
NSLog(@"Error loading file: %@", error.localizedDescription);
}
[[[self effect] texture2d0] setName:info.name];
[[[self effect] texture2d0] setEnabled:YES];
[[[self effect] texture2d0] setEnvMode:GLKTextureEnvModeDecal];
纹理只是一个带有实心点的poka点纹理,负空间是完全透明的。我是openGL的新手。谢谢你的帮助!
我包含了我想要完成的内容的链接。只是接近结尾,你会看到纹理是如何混合在一起的。
答案 0 :(得分:2)
两件事 - 首先,你确实需要启用混合。你的代码中有这个,但它被注释掉了:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
其次,我看到你正在使用GLKit GLKBaseEffect。我通过反复试验发现你必须设置纹理env模式来替换,而不是贴花以使透明度起作用:
self.effect.texture2d0.envMode = GLKTextureEnvModeReplace;