2013-07-09 6 views
1

Я использую следующую ссылку для исходного кода для рисования 3D-куба в iOS.GLKit Transparent Texture

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

}

Я пытаюсь создать куб с текстурой, которая имеет прозрачность, и в конечном итоге сделать лежащее в основе лица. Я прикрепил свою фактическую текстуру. Теперь это выглядит как куб, показывающий все лица без прозрачности, показывающие нижние грани. Если я раскомментирую подпрограммы 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. Спасибо вам за помощь!

Я включаю ссылку на то, что я пытаюсь выполнить. Просто, чтобы приблизиться к концу, и вы увидите, как текстуры смешиваются.

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

ответ

2

две вещи - во-первых, вы на самом деле нужно активировать смешивание. У вас есть это в вашем коде, но это закомментирована:

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

Во-вторых, я вижу, что вы используете GLKit GLKBaseEffect. Я нашел через пробную версию и ошибку, что вам нужно установить режим текстуры текстуры, чтобы заменить, а не наклейку, чтобы прозрачность работала:

self.effect.texture2d0.envMode = GLKTextureEnvModeReplace;