Opengl ES 在 GL_TRIANGLES 上正确绘制线框

Opengl ES draw wireframe over GL_TRIANGLES correctly

我需要围绕一个立方体画一个线框,我已经做好了一切,但我在 alpha 测试方面遇到了一些问题,无论我做什么,GL_LINES 要么与 GL_TRIANGLES 重叠,要么不与 GL_TRIANGLES 重叠必须(他们在他们后面)或者 GL_TRIANGLES 与 GL_LINES 保持重叠(当线条应该可见时)。

    Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
    Gdx.gl.glEnable(GL20.GL_DEPTH_TEST);
    SquareMap.get().shader.getShader().begin();
    SquareMap.get().shader.getShader().setUniformMatrix(u,camera.combined);
    LineRenderer3D.get().render(SquareMap.get().shader,worldrenderer.getCamera());
    TriangleRenderer3D.get().render(SquareMap.get().shader,worldrenderer.getCamera());
    SquareMap.get().shader.getShader().end();

而且线框比立方体大一点。

TriangleRenderer3D.get().renderLineRenderer3D().render只是加载顶点并调用gl_drawarrays

通过启用深度遮罩,立方体 GL_TRIANGLES 与线条重叠

我需要启用我在这里遗漏的东西吗?

值得一提的是,线图元的像素覆盖规则不同于三角形。一条线必须穿过像素中心的菱形图案才能可见,而三角形需要覆盖左上角。 This documentation 适用于 Direct3D,但它在描述这些规则(在 GL 中相同)方面比我遇到的任何 OpenGL 文档做得更好。

至于解决这个问题,最常见的方法是对所有顶点位置应用一个小的偏移量以更好地对齐它们的中心。这通常是通过将 X 和 Y 平移 0.375 个单位来完成的。

另一个 Microsoft document 也解释了这一点。


虽然第一段中描述的一些问题可能与原始覆盖相关,但 none 在最后一段中。

最后几段中描述的问题可以这样解决:

//
// Write wires wherever the line's depth is less than or equal to the triangles.
//
glDepthFunc (GL_LEQUAL);
TriangleRenderer3D.get().render(SquareMap.get().shader,worldrenderer.getCamera());
LineRenderer3D.get().render(SquareMap.get().shader,worldrenderer.getCamera());

通过先渲染三角形,然后仅在它们位于前面或与其深度相同的位置绘制线(默认深度测试会丢弃这种情况),您应该会得到想要的行为。 启用深度写入