如何在OpenGL ES中删除隐藏线条的线框网格?

时间:2015-06-01 06:33:47

标签: android opengl-es

我想要绘制的多维数据集:

上面的多维数据集很容易在OpenGL中用函数glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)创建,但是众所周知,OpenGL ES不包含我想要使用的函数。 总之,我不想像这样绘制多维数据集:

我要感谢那些可以提供帮助的人。

========================最少更新图片==================== ======

后缘比前缘略薄。有没有解决方案来解决这个问题?

当前代码:

    GLES20.glEnable(GLES20.GL_DEPTH_TEST);
    GLES20.glDisable(GLES20.GL_POLYGON_OFFSET_FILL);
    // Draw edge
    GLES20.glDrawElements(GLES20.GL_LINES, lineIndices.length,
            GLES20.GL_UNSIGNED_SHORT, lineIndexBuffer);

    GLES20.glEnable(GLES20.GL_POLYGON_OFFSET_FILL);
    GLES20.glPolygonOffset(1.0f, 1.0f);
    // Apply background color and draw faces
    GLES20.glUniform4fv(mColorHandle, 1, faceColor, 0);
    GLES20.glDrawElements(GLES20.GL_TRIANGLES, triangleIndices.length,
            GLES20.GL_UNSIGNED_SHORT, triangleIndexBuffer);

1 个答案:

答案 0 :(得分:3)

这是一个标准技巧(假设启用深度缓冲):

  1. 绘制网格边(线)
  2. 使用背景颜色填充网格多边形(以掩盖隐藏的线条)
  3. 由于网格边和网格面具有相同的z值,因此需要解决 z-fighting 问题。最简单的方法是使用多边形偏移使边缘"悬停"稍微"以上"多边形面:

    gl.disable(gl.POLYGON_OFFSET_FILL)
    /* draw polygon edges */
    gl.enable(gl.POLYGON_OFFSET_FILL);
    gl.polygonOffset(1.0, 1.0);
    /* fill polygons in background color */
    

    这是一个线框酒杯,用于说明z-fighting问题:

    enter image description here

    在这里,我使用多边形偏移解决了z-fighting问题:

    enter image description here