GLKit:处理大型 3D 对象时的透明纹理
GLKit: Transparent texture when dealing with big 3D object
我正在编写一个显示 .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 文件,纹理突然变得 透明!我已经用相同的纹理文件进行了测试,所以我认为 图像大小不是原因 。请看看下面的截图来了解一下:
大对象:大约 20000 个顶点
小物体:约5000个顶点:
相当大的对象:大约 67000 个顶点:
只有两种颜色(蓝色和黄色)的纹理位图,用于大和相当大的objs
胶囊纹理(我没有使用2色纹理,这样我们可以清楚地看到小物体没有透明度)
我在不同的obj上尝试过不同的纹理,但总是出现同样的问题:当obj文件很大时,纹理开始变得透明。我还在不同的物理 Iphone 上进行了测试,因此它不是特定于模拟器的。 Enable/disable 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);
我终于找到了解决方案:
首先,您需要在 GLKView 的故事板中将深度格式设置为 24 或 16:
然后通过
在 viewDidLoad() 中启用深度
glEnable(GL_DEPTH_TEST);
最后,对于每个绘制调用,您需要清除深度缓冲区:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
我正在编写一个显示 .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 文件,纹理突然变得 透明!我已经用相同的纹理文件进行了测试,所以我认为 图像大小不是原因 。请看看下面的截图来了解一下:
大对象:大约 20000 个顶点
小物体:约5000个顶点:
相当大的对象:大约 67000 个顶点:
只有两种颜色(蓝色和黄色)的纹理位图,用于大和相当大的objs
胶囊纹理(我没有使用2色纹理,这样我们可以清楚地看到小物体没有透明度)
我在不同的obj上尝试过不同的纹理,但总是出现同样的问题:当obj文件很大时,纹理开始变得透明。我还在不同的物理 Iphone 上进行了测试,因此它不是特定于模拟器的。 Enable/disable 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);
我终于找到了解决方案:
首先,您需要在 GLKView 的故事板中将深度格式设置为 24 或 16:
然后通过
在 viewDidLoad() 中启用深度 glEnable(GL_DEPTH_TEST);
最后,对于每个绘制调用,您需要清除深度缓冲区:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);