Открыть GL, glDrawElements, GL_LINE_LOOP неправильно соединяет вершины - PullRequest
1 голос
/ 11 марта 2019

Когда я рисую один квадрат со следующими вершинами:

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,
};

Результат хорош, он рисует цикл правильно enter image description here

, но когда я рисую другой параллельный квадратследуя

 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,
};

результат таков: enter image description here enter image description here

Я не знаю, почему это происходит.Я думаю, что есть кое-что, чего я не знаю о том, как GL_LINE_LOOP работает. GL_LINE_STRIPS тоже дает тот же результат.Как это исправить?Я хочу, чтобы квадраты были отдельными.

код следующий:

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

Заранее спасибо.

извините за большие картинки Я надеюсь, что кто-то поможет мне исправить это.

1 Ответ

0 голосов
/ 11 марта 2019

Если вы хотите нарисовать несколько GL_LINE_LOOP одним вызовом, то вы можете использовать технологию Primitive Restart .

Фиксированный индекс перезапуска примитива должен быть 2 ^ N-1, где N - это число битов типа данных, используемых для индексов.
Это означает 255 для GL_UNSIGNED_BYTE, 65535 для GL_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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...