我正在尝试为 iOS 创建一个 3D 函数绘图仪。我已经成功地使用三角形条来渲染图形,并且还实现了通过线条绘制线框。但是,如果我使用 24 位(或 16 位无关紧要)深度缓冲区同时渲染两者,则线条会被多边形部分遮挡,使它们看起来非常细或完全消失。关闭 4xMSAA 并不能解决问题。有关示例,请参见下图。
只画线条就可以了——线条的粗细恰到好处。如果我为线条禁用深度缓冲,它们也会正确绘制,但它们当然会出现在所有多边形之上(即确实被多边形隐藏的线条)。我还尝试降低多边形的透明度,但无济于事。稍微增加线条的 y 坐标会使它看起来更好,只要你从上面看它们,这样它们就确实在多边形的前面。
为了获得最佳性能,我在渲染之前将所有顶点数据和索引静态存储到顶点数组中。因此,我的渲染循环很短:
- (void)drawRect:(CGRect)rect
{
glClearColor(1, 1, 1, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[self.effect prepareToDraw];
for (NSUInteger i = 0; i < _nVertexArrays; i ++)
{
glBindVertexArrayOES(_vertexArrays[i].vertexArray);
glDrawElements(_vertexArrays[i].mode, _vertexArrays[i].indexCount, GL_UNSIGNED_INT, NULL);
}
}
如何同时正确显示多边形和线框?我还想过只是将线条移动到更靠近相机现在恰好所在的位置,但我不知道如何在 OpenGL ES 中做到这一点,而且我不确定它是否会影响性能,因为这种转变取决于相机的当前位置。是否可以在绘制线条之前对线条动态应用转换?