繁体   English   中英

OpenGL ES渲染三角形网格-iPhone中的黑点和模拟器中的完美图像

[英]OpenGL ES rendering triangle mesh - Black dots in iPhone and perfect image in simulator

这不是其他StackOverflow问题中所述的与纹理有关的问题: 在iOS上渲染为纹理...

我的重画循环:

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glTranslatef(0.0f, 0.0f, -300.0f);
glMultMatrixf(transform);

glVertexPointer(3, GL_FLOAT, MODEL_STRIDE, &model_vertices[0]);
glEnableClientState(GL_VERTEX_ARRAY);

glNormalPointer(GL_FLOAT, MODEL_STRIDE, &model_vertices[3]);
glEnableClientState(GL_NORMAL_ARRAY);

glColorPointer(4, GL_FLOAT, MODEL_STRIDE, &model_vertices[6]);
glEnableClientState(GL_COLOR_ARRAY);
glEnable(GL_COLOR_MATERIAL);
glDrawArrays(GL_TRIANGLES, 0, MODEL_NUM_VERTICES);

模拟器中的结果:

在模拟器中渲染的图像

然后将结果显示在iPhone 4(使用OpenGLES 1.1的iOS5)中: 在设备中渲染的图像

注意黑点,当您旋转对象时,它们是随机的(大脑)

网格具有15002个顶点和30k三角形。

关于如何在设备映像中解决此抖动的任何想法?

我已经解决了增加深度缓冲区精度的问题:

// Set up the projection
static const GLfloat zNear = 0.1f, zFar = 1000.0f, fieldOfView = 45.0f;
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
GLfloat size = zNear * tanf(DEGREES_TO_RADIANS(fieldOfView) / 2.0);
CGRect rect = self.bounds;
glFrustumf(-size, size, -size / (rect.size.width / rect.size.height), size / (rect.size.width / rect.size.height), zNear, zFar);
glViewport(0, 0, rect.size.width, rect.size.height);
glMatrixMode(GL_MODELVIEW);

在产生抖动的代码中,zNear为0.01f

提示来自devforums.apple.com

您发布的代码中没有什么特别的会引起这种情况。 由于模型中顶点处理的精度限制,问题可能出在网格数据中,而不是代码中。 如果相邻三角形的共享顶点的位置值接近但不相同,则这种类型的问题很常见。 这也是在GPU和模拟器之间通常会有所不同的事物的类型。

您说黑点在旋转对象时随机闪烁。 如果要旋转对象,我认为您的真实代码并不总是在模型视图中加载身份矩阵吗?

如果三角形之间的间隙比一个像素的预计大小小得多,那么通常它们最终将被四舍五入为相同的像素,并且您不会看到任何问题。 但是,如果一个顶点在一个方向上被倒圆,而另一个顶点在另一个方向上倒圆,则可能会留下一个像素的间隙。 舍入误差的位置将取决于变换矩阵,因此将随着对象旋转移动每一帧。

如果加载不同的网格,会得到相同的错误吗?

如果您的大脑网格物体可以在3D建模应用程序中进行编辑的数据格式,则搜索名为“焊接顶点”或“合并顶点”之类的选项。 您设置顶点的最小阈值,使其被视为相同,它将在该距离内寻找顶点对,并移动一个(或两个)以完美匹配。 许多3D建模应用程序将具有清理工具,以确保网格是多方面的,这意味着(除其他事项外)网格中没有孔。 通常,您只想处理3D渲染中的流形网格。 您也可以在自己的代码中焊接顶点,尽管该操作很昂贵,通常除非您必须这样做,否则通常不是您希望在运行时执行的操作类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM