OpenGLES 2.0(GLKit,iPhone):多边形部分遮挡线框线条

时间:2011-12-26 16:34:19

标签: ios opengl-es opengl-es-2.0 depth-buffer glkit

我正在尝试为iOS创建一个3D功能绘图仪。我已成功使用三角形条渲染图形,并通过线条实现绘制线框。但是如果我使用24位(或16位无关紧要)深度缓冲同时渲染两者,则线条会被多边形部分遮挡,使得它们看起来非常薄或完全消失。关闭4xMSAA无法解决问题。请参阅下图以获取示例。

example of partially obscured lines

只绘制线条很好 - 线条的厚度恰到好处。如果我对线条禁用深度缓冲,它们也会被正确绘制,但它们当然会出现在所有多边形上方(即多边形确实被多边形隐藏的线条)。我也试图减少多边形的透明度,但没有用。略微增加线的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中做到这一点,我不确定它是否会影响性能,因为这种转变取决于相机的当前位置。是否可以在绘制之前动态地将变换应用于线?

1 个答案:

答案 0 :(得分:2)

结帐glPolygonOffset。它专门用于此用途。

相关问题