Opengl ES - z轴上渲染不正确?

3
我有一个雪人的模型,它是从.obj文件中加载的。除了使用glRotatef()旋转模型时,雪人的头部总是在身体前面渲染之外,一切都很正常。雪人的鼻子也总是在头部后面渲染。这会导致在旋转时雪人改变方向的效果,但实际上只是部件没有按正确的z顺序渲染。为什么会发生这种情况?
注意:所有雪人的部件都来自使用blender创建的同一个.obj文件。
像这样渲染模型(在绘制循环中)。
glVertexPointer(3 ,GL_FLOAT, 0, model_verts);
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, model_normals);
glDrawElements(GL_TRIANGLES, num_model_indices*3, GL_UNSIGNED_SHORT, &model_indices);

像这样旋转(在touchesMoved中)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
 UITouch *touch = [touches anyObject];
 touchBeginPos = [touch locationInView:self];

}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
 CGPoint touchEndPos = [[touches anyObject] locationInView:self];
 glMatrixMode(GL_MODELVIEW_MATRIX);
 glRotatef(10, (touchBeginPos.y - touchEndPos.y)/4, -(touchBeginPos.x - touchEndPos.x)/4, 0.0f);
 touchBeginPos = touchEndPos;
}

发布一些高级代码可能有助于解释正在发生的事情。 - luke
还有其他可能有用的信息吗? - Joe Cannatti
2个回答

5
请检查场景中是否错误地应用了负(镜像)比例尺。还要检查是否使用了Z缓冲,也许没有使用。
此页面谈到了Blender的坐标系,与另一个3D系统进行比较,可能作为参考有一定的难度,但我对其有一定的信心。 这个页面

我在createFramebuffer方法中添加了以下代码:glGenRenderbuffersOES(1, &depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);并在drawView中添加了以下代码:glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); - Joe Cannatti
@Joe:谢谢。如果你把代码编辑到问题中,可能在底部加上“更新:”之类的标题来显示它是新的,那么阅读代码就会容易得多。 - unwind

0

UIKit纹理的坐标是倒置的,因此您有两个选择:

  1. 调整纹理映射的V坐标为(1-vcoord)
  2. 在绘制到稍后将加载到gl中的上下文之前翻转图像。

如果您正在使用CG来加载纹理,则可以添加ScaleCTM:

CGContextRef context = CGBitmapContextCreate( imageData, ....
CGContextClearRect( context, ...
CGContextScaleCTM( context, 1.0, -1.0);  // flip the texture vertically
CGContextDrawImage( context, CGRectMake( 0, 0, width, height ), image.CGImage );
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接