VAO рисует неправильный индекс

В настоящее время я пытаюсь рисовать формы с помощью уже созданного для меня трехмерного движка, который выводит мне форму с вершинами и треугольниками. вершины указываются только один раз, а треугольники строятся против часовой стрелки. У меня проблема с частью чертежа, потому что в определенный момент OpenGL начинает использовать индексы, которые я не указываю.

Код для установки формы в буферы и VBO находится здесь:

//Reset index Count
    indicesCount.add(s.triangles().size() * 3);
    int vertexCount = s.getVertices().size() * 3;

    //Set Hash Map
    s.setHashMap();

    for (int i = 0; i < s.getVertices().size(); i++) {
        System.err.println(s.getVertices().get(i));
    }

    //Initialize the Buffers
    vertBuff = BufferUtils.createFloatBuffer(vertexCount);
    normalBuff = BufferUtils.createFloatBuffer(vertexCount);
    indicesBuff = BufferUtils.createIntBuffer(indicesCount.get(this.objectCount - 1));

    //Place all the indices into the ByteBuffer
    ArrayList<Triangle> tempTriangles = s.triangles();

    for (Triangle t : tempTriangles) {
        for (int i = 0; i < 3; i++) {
            indicesBuff.put((s.getHashMap().get(t.vertex.get(i))));
            System.err.print(s.getHashMap().get(t.vertex.get(i)));
        }
        System.err.print('\n');
    }

    System.out.println("Hashmap: " + s.getHashMap().toString());

    //Place all the vertices in the FloatBuffer
    for (Vector v : s.getVertices()) {
        vertBuff.put((float) v.x);
        vertBuff.put((float) v.y);
        vertBuff.put((float) v.z);
        normalBuff.put((float) v.normalized().x);
        normalBuff.put((float) v.normalized().y);
        normalBuff.put((float) v.normalized().z);
    }

    //Close the Buffer for input
    vertBuff.flip();
    indicesBuff.flip();
    normalBuff.flip();

    generateOneVBO();
    setChanged(true);
}
 private void generateOneVBO() {

    vao_IDs.add(glGenVertexArrays());
    glBindVertexArray(vao_IDs.get(this.objectCount - 1));
    i_IDs.add(glGenBuffers());
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_IDs.get(this.objectCount - 1));
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesBuff, GL_STATIC_DRAW);
    // glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

    //Generate Buffers and get IDs
    v_IDs.add(glGenBuffers());
    glBindBuffer(GL_ARRAY_BUFFER, v_IDs.get(this.objectCount - 1));
    glBufferData(GL_ARRAY_BUFFER, vertBuff, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

Это моя функция рендеринга (которая зацикливается при каждом изменении)

private synchronized void render(int p_Id) {
    Vector4f selectedColor = new Vector4f(1, 0, 0, 1f);
    Vector4f normalColor = new Vector4f(0.5f, 0.5f, 0.5f, 1f);

    // glMatrixMode(GL_PROJECTION_MATRIX);
    for (int index = 0; index < v_IDs.size(); index++) {

        glBindVertexArray(vao_IDs.get(index));
        glEnableVertexAttribArray(0);
        glEnableVertexAttribArray(1);

        //  glPointSize(3.0f);
        // glEnable(GL_POINT_SMOOTH);
        //Draw triangles
        if (selected.get(index)) {
            shader.setUniform(p_Id, "shapeColor", selectedColor);
        } else {
            shader.setUniform(p_Id, "shapeColor", normalColor);
        }
        //glDrawElements(GL_TRIANGLES, indicesCount.get(index), GL_UNSIGNED_INT, 0);
        //Draw Wireframe
        shader.setUniform(p_Id, "shapeColor", new Vector4f(1, 1, 1, 0.75f));
        //glDrawElements(GL_LINE_STRIP, indicesCount.get(index), GL_UNSIGNED_INT, 0);
        int num = 0;
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

        Vector4f[] arr = {
            new Vector4f(1f, 0, 0, 1),
            new Vector4f(0f, 1, 0, 1),
            new Vector4f(0f, 0, 1, 1)
        };

        for (int i = 0; i < toDraw; i += 3) {
            if (i % 3 == 0) {
                num++;
            }
            shader.setUniform(p_Id, "shapeColor", arr[num % 3]);
              glDrawElements(GL_POLYGON, i + 3, GL_UNSIGNED_INT, i);
        }

        glDisableVertexAttribArray(0);
        glDisableVertexAttribArray(1);
        glBindVertexArray(0);

    }
}

Я заставил цикл рендеринга рисовать мой треугольный каркас / треугольники шаг за шагом, добавляя прослушиватель щелчков и добавляя 3 к переменной toDraw, с этим я мог видеть первый раз, когда он испортился. В дополнение к коду я распечатал как хэш-карту, которая используется для преобразования из вершины в индекс, так и вывод индексов, который печатается после добавления каждого индекса в буфер.

 Hashmap: {15.0 -15.0 15.0=2, -15.0 -15.0 15.0=3, 15.0 15.0 15.0=0, -15.0 15.0 15.0=1, -15.0 -15.0 -15.0=7, 15.0 -15.0 -15.0=6, -15.0 15.0 -15.0=5, 15.0 15.0 -15.0=4}

Индексы:

201
213
315
357
045
051
264
240
675
654
623
637.

каждая тройка чисел представляет собой треугольник, поэтому первый треугольник указывает на индексы 2->0->1 и так далее.

Вот окно после первого треугольника VAO рисует неправильный индекс

Окно после второго щелчка VAO рисует неправильный индекс

Окно после третьего щелчка, где сначала происходит сбой VAO рисует неправильный индекс

Я отлаживаю это уже несколько дней и не знаю, что не так. Я думаю, что это может быть способ, которым я это рисую (параметры, которые я задаю), но это всего лишь предположение.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
104
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не рисуете треугольники:

          glDrawElements(GL_POLYGON, i + 3, GL_UNSIGNED_INT, i);

Вы рисуете многоугольники с n вершинами. При i = 0 вы фактически получите треугольник. Для i=3 (и вы увеличиваете i с шагом 3 в цикле`, вы в конечном итоге рисуете шестиугольник с использованием 6 элементов вашего индексного буфера, начиная с четвертого байт. И так далее.

Здравствуйте, So ive устранил проблему, и мне пришлось умножить смещение на 4, чтобы заставить его работать так, как должно (с исправлением n-й проблемы многоугольника). Я понимаю, зачем умножать на два, потому что это целое число без знака. но я не понимаю, зачем нужен 4, потому что 2 не помогло со смещением

Itay Bachar 30.07.2018 22:16

Смещение для glDrawElements находится в байты. "Я понимаю, зачем умножать на два, потому что это целое число без знака" Эээ? GLuint определяется как 32 бита, что составляет 4 байта.

derhass 31.07.2018 18:26

Другие вопросы по теме