OpenGL не отображает мою сетку

Используя LWJGL, я попытался визуализировать простую сетку на экране, но вместо этого OpenGL решил ничего не делать. :(

Итак, у меня есть класс сетки, который создает VBO. Я могу добавить несколько вершин, которые затем должны отображаться на экране.

public class Mesh {

    private int vbo;
    private int size = 0;

    public Mesh() {
        vbo = glGenBuffers();
    }

    public void addVertices(Vertex[] vertices) {
        size = vertices.length;

        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glBufferData(GL_ARRAY_BUFFER, Util.createFlippedBuffer(vertices), GL_STATIC_DRAW);
    }

    public void draw() {
        glEnableVertexAttribArray(0);

        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glVertexAttribPointer(0, 3, GL_FLOAT, false, Vertex.SIZE * 4, 0);

        glDrawArrays(GL_TRIANGLES, 0, size);

        glDisableVertexAttribArray(0);
    }

}

Вот как я добавляю вершины в свою сетку:

mesh = new Mesh();

Vertex[] vertices = new Vertex[] { new Vertex(new Vector3f(-1, -1, 0)),
                                   new Vertex(new Vector3f(-1, 1, 0)),
                                   new Vertex(new Vector3f(0, 1, 0)) };

mesh.addVertices(vertices);

Я почти уверен, что добавил их в правильном (по часовой стрелке) порядке.

И моя настройка OpenGL:

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

glFrontFace(GL_CW);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);

Вызов glGetError() возвращает нет ошибки (0).

ИЗМЕНИТЬ:

Ну, я узнал, что Mac немного странные, когда дело доходит до OpenGL. Мне нужно было использовать VAO вместе с VBO. Теперь он работает нормально. Спасибо, в любом случае!


person user1734282    schedule 15.07.2014    source источник
comment
addVertices — неправильное название, оно заменяет существующие вершины, setVertices было бы более точным именем.   -  person ratchet freak    schedule 15.07.2014
comment
Я знаю, но спасибо, что указали на это. Я добавляю их только один раз.   -  person user1734282    schedule 15.07.2014
comment
Вы используете шейдеры или фиксированный конвейер?   -  person Reto Koradi    schedule 16.07.2014


Ответы (2)


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

Я бы предложил проверить/установить следующее

  • Отключите отсечение лиц, чтобы убедиться, что независимо от обмотки вы должны что-то видеть
  • Если вы запрашиваете базовый профиль, вам понадобится шейдер и, вполне возможно, объект массива вершин.
  • Если вместо этого вы используете профиль совместимости, вы должны вызвать glColor3f(1, 1, 1) в своем вызове отрисовки, чтобы убедиться, что вы не рисуете черный треугольник.
  • Очищаете ли вы фреймбуферы цвета и глубины перед рендерингом?
person Jherico    schedule 15.07.2014

Возможно, вы не рисуете этот объект внутри усеченной пирамиды видимости, также вызовите glCheckError, чтобы убедиться, что вы не делаете ошибок.

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

person David Carpenter    schedule 15.07.2014