0

我正在尝试为 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 中做到这一点,而且我不确定它是否会影响性能,因为这种转变取决于相机的当前位置。是否可以在绘制线条之前对线条动态应用转换?

4

1 回答 1

2

查看glPolygonOffset。它是专门为此用途而制造的。

于 2011-12-26T16:42:51.997 回答