2013-07-09 193 views
1

我在iOS中使用以下鏈接獲取繪製3D立方體的源代碼。GLKit透明紋理

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]; 

質地只是一個波卡點質地堅實點和負空間是完全透明的。我對openGL很陌生。感謝您的幫助!

我正在包括我試圖完成的一個鏈接。只是爲了接近尾聲,你會看到紋理如何混合在一起。

http://www.youtube.com/watch?v=TtK_8sddGaQ

回答

2

兩兩件事 - 第一,你其實需要啓用混合。你有這個在你的代碼,但它被註釋掉:

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

其次,我看到你使用GLKit GLKBaseEffect。我發現通過試驗和錯誤,你必須設置紋理env模式來替換,而不是decal以便透明化工作:

self.effect.texture2d0.envMode = GLKTextureEnvModeReplace;