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. Теперь все отлично работает. Спасибо, в любом случае!

2 ответа

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

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

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

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

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

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