2015-06-09 2 views
1

Я пишу 3D Viewer, который отображает .obj файл и предлагает несколько основных жестов (пиннинг, вращение, масштабирование), следуя 2 Raywenderlich учебных пособий: http://www.raywenderlich.com/48293/how-to-export-blender-models-to-opengl-es-part-1GLKit: Прозрачная текстура при работе с большим 3D объектом

http://www.raywenderlich.com/50398/opengl-es-transformations-gestures

Я могу загружать и отображать правильно небольшие .obj-файлы, но для больших файлов .obj, текстуры становятся внезапными transparent! Я тестировал с теми же файлами текстур, поэтому я думаю, что размер изображения не является причиной. Пожалуйста, обратите внимание на скриншоте ниже, чтобы иметь представление:

Big OBJ: около 20000 вершин Big obj: about 20000 vertices

Small Obj: около 5000 Вершины: Small obj: about 5000 vertices

Довольно большой OBJ: около 67000 вершин: Quite big obj: about 67000 vertices

текстура растровый только 2 цвета (синий и желтый), которые используются в больших и очень больших OBJS A texture bitmap with only 2 colors (blue and yellow) which are used in big objs

Капсулы текстуры (я не использую текстуру 2 цвета, так что мы можем ясно видеть, нет прозрачности в небольшом OBJ) The capsule texture

Я пробовал различные текстуры на разном OBJ и это всегда та же проблема: текстура начинает быть прозрачной, когда файл obj большой. Я также тестировал на разных физических Iphone, поэтому он не специфичен для симулятора. Включение/выключение gl_blend также не решает проблему.

Вы можете найти полный код на http://pastecode.org/index.php/view/32247978 Вот код, который я использую для создания GLKBaseEffect и текстура нагрузки изображения:

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

// Texture 
NSDictionary* options = @{ GLKTextureLoaderOriginBottomLeft: @YES }; 
NSError* error; 
NSString* path = [[NSBundle mainBundle] pathForResource:@"capsule0.jpg" ofType:nil]; 

GLKTextureInfo* texture = [GLKTextureLoader textureWithContentsOfFile:path 
                   options:options 
                   error:&error]; 

if(texture == nil) 
    NSLog(@"Error loading file: %@", [error localizedDescription]); 

self.effect.texture2d0.name = texture.name; 
self.effect.texture2d0.enabled = true; 
self.effect.texture2d0.envMode = GLKTextureEnvModeReplace; 


// Light 
self.effect.light0.enabled = GL_TRUE; 
self.effect.light0.position = GLKVector4Make(1.0f, 1.0f, 1.0f, 1.0f); 
self.effect.lightingType = GLKLightingTypePerVertex; 

И эта часть предназначена для настройки OpenGL в viewDidLoad() после создания эффект:

// OpenGL ES Settings 
glClearColor(0.5f, 0.5f, 0.5f, 1.0f); 
glEnable(GL_CULL_FACE); 
glEnable(GL_DEPTH_TEST); 
+0

Можете ли вы разместить любые изображения с хорошей текстурой, чтобы угадать это четко. Это туф, чтобы догадаться с вышеупомянутыми текстурами. Проблемой может быть либо отбраковка, либо нормаль. – VivekParamasivam

+0

@GoodnezEverywer: Я только что загрузил текстурные изображения, используемые в 3-х моделях. – Son

+0

Отключить отбраковку и проверить, исправляется ли она. Если он исправит проблему, то некоторые нормали в сетке перевернут, так что вам нужно исправить нормальный расчет. – VivekParamasivam

ответ

0

Я наконец нашел решение:

Во-первых, необходимо установить формат глубины в 24 или 16 в раскадровке для GLKView: enter image description here

Затем включите глубину в viewDidLoad() по

glEnable(GL_DEPTH_TEST); 

И, наконец, для каждого вызова отрисовки, вам нужно очистить буфер глубины:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);