Я пишу 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 вершин
Small Obj: около 5000 Вершины:
Довольно большой OBJ: около 67000 вершин:
текстура растровый только 2 цвета (синий и желтый), которые используются в больших и очень больших OBJS
Капсулы текстуры (я не использую текстуру 2 цвета, так что мы можем ясно видеть, нет прозрачности в небольшом OBJ)
Я пробовал различные текстуры на разном 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);
Можете ли вы разместить любые изображения с хорошей текстурой, чтобы угадать это четко. Это туф, чтобы догадаться с вышеупомянутыми текстурами. Проблемой может быть либо отбраковка, либо нормаль. – VivekParamasivam
@GoodnezEverywer: Я только что загрузил текстурные изображения, используемые в 3-х моделях. – Son
Отключить отбраковку и проверить, исправляется ли она. Если он исправит проблему, то некоторые нормали в сетке перевернут, так что вам нужно исправить нормальный расчет. – VivekParamasivam