首页 > 解决方案 > 打开 GL、glDrawElements、GL_LINE_LOOP 没有正确连接顶点

问题描述

当我用以下顶点绘制一个正方形时:

private static float[] vertexArray = {
        // vertex
        -0.5f,  0.5f, 0.5f,
        -0.5f, -0.5f, 0.5f,
        0.5f, -0.5f, 0.5f,
        0.5f,  0.5f, 0.5f            
};
private static short indicesArray[] = {
        0, 1, 2,
        0, 2, 3,
};

结果很好,它可以正确绘制循环在此处输入图像描述

但是当我通过以下绘制另一个平行正方形时

 private static float[] vertexArray = {
        // vertex
        -0.5f,  0.5f, 0.5f,
        -0.5f, -0.5f, 0.5f,
        0.5f, -0.5f, 0.5f,
        0.5f,  0.5f, 0.5f,

        -0.5f,  0.5f, -0.5f,
        -0.5f, -0.5f, -0.5f,
        0.5f, -0.5f, -0.5f,
        0.5f,  0.5f, -0.5f,

};
private static short indicesArray[] = {
        0, 1, 2,
        0, 2, 3,

        4, 5, 6,
        4, 6, 7,
};

结果是这样的: 在此处输入图像描述 在此处输入图像描述

我不知道为什么会这样。我认为有些东西我不知道GL_LINE_LOOP是如何工作的。GL_LINE_STRIPS 也给出相同的结果。如何解决这个问题?我希望正方形是分开的。

代码如下:

  GLES30.glDrawElements(GLES30.GL_LINE_LOOP, indicesArray.length,GLES30.GL_UNSIGNED_SHORT,0);

提前致谢。

对不起,我希望有人能帮我修复它。

标签: androidopengl-es

解决方案


如果你想GL_LINE_LOOP通过一次绘制调用绘制多个,那么你可以使用Primitive Restart技术。

固定的原始重启索引必须是 2^N-1,其中 N 是用于索引的数据类型的位数。
这意味着255GL_UNSIGNED_BYTE65535GL_UNSIGNED_SHORT和 2147483647 GL_UNSIGNED_INT

将索引添加到索引列表中,在形成分离基元的索引之间:

private static short indicesArray[] = {
    0, 1, 2,
    0, 2, 3,

    65535, // restart primitive

    4, 5, 6,
    4, 6, 7,
};

必须启用具有固定索引的原始重启:

glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);

在桌面 OpenGL 中,可以通过 选择重启索引glPrimitiveRestartIndex。这必须由 启用glEnable(GL_PRIMITIVE_RESTART)


推荐阅读