【问题标题】:GLKit: Transparent texture when dealing with big 3D objectGLKit:处理大型 3D 对象时的透明纹理
【发布时间】:2015-06-09 17:10:43
【问题描述】:

我正在编写一个显示 .obj 文件并提供一些基本手势(固定、旋转、缩放)的 3D 查看器,遵循 2 个 Raywenderlich 教程: http://www.raywenderlich.com/48293/how-to-export-blender-models-to-opengl-es-part-1

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

我能够正确加载和显示小的 .obj 文件,但对于大的 .obj 文件,纹理突然变得透明!我已经使用相同的纹理文件进行了测试,所以我认为 图像大小不是原因。请看下面的截图来了解一下:

Big obj:大约 20000 个顶点

小obj:大约5000个顶点:

相当大的obj:大约67000个顶点:

只有 2 种颜色(蓝色和黄色)的纹理位图,用于大对象和相当大的对象

胶囊纹理(我不使用 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;

这部分是在创建效果后在viewDidLoad()中设置OpenGL:

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

【问题讨论】:

  • 您能否发布任何具有适当纹理的更好图像以清楚地猜测它。用上面的纹理猜测是凝灰岩。剔除或法线应该是问题所在。
  • @GoodnezEverywer:我刚刚上传了3个模型使用的纹理图片
  • 禁用剔除并验证它是否修复。如果它解决了问题,那么网格中的一些法线会翻转,因此您需要修复法线计算。
  • 感谢您的帮助。最后,它只是 GLKView 的 Xcode 配置,并启用了 OpenGL 的深度 ...

标签: ios objective-c opengl-es glkit


【解决方案1】:

我终于找到了解决办法:

首先,您需要在 GLKView 的情节提要中将深度格式设置为 24 或 16:

然后通过

在viewDidLoad()中启用深度
    glEnable(GL_DEPTH_TEST);

最后,对于每个绘图调用,您需要清除深度缓冲区:

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

【讨论】:

    猜你喜欢
    • 2012-10-28
    • 2023-03-11
    • 2013-11-05
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多