Проблема с простым примером VBO

Я пытаюсь получить супер простой пример GLFW и VBO, но я застрял. Я использовал glBegin и glEnd для других проектов, но я пытаюсь обновить свой код для работы с OpenGL ES 2, но на данный момент я просто хочу быть как можно более передовым.

В некоторых примерах в Интернете я придумал следующий код:

 #include  #include  #include  #define bool int #define true 1 #define false 0 const int width = 800; const int height = 600; bool opened = true; GLuint glTriangle; GLfloat triangle[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, }; void init() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glGenBuffers(1, &glTriangle); glBindBuffer(GL_ARRAY_BUFFER, glTriangle); glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW); } void display() { glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, glTriangle); glVertexAttribPointer(0L, 3, GL_FLOAT, GL_FALSE, 0, 0); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableVertexAttribArray(0); } int windowClose(GLFWwindow window) { opened = false; return GL_TRUE; } void main() { if (!glfwInit()) { printf("glfwInit didn't work\n"); return; } GLFWwindow window = glfwCreateWindow(width, height, GLFW_WINDOWED, "Test", 0); glfwMakeContextCurrent(window); init(); glfwSetWindowCloseCallback(window, windowClose); glfwSwapInterval(1); while(opened) { display(); glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); } 

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

Если это имеет значение, я компилирую с помощью: gcc -o test -lGL -lglfw -lm test.c в Linux с OpenGL версии 2.1 через драйвер Mesa.

Что я делаю неправильно? Если мне нужно указать информацию о цвете, что это простой способ сделать это?

    Вы не должны использовать glEnableVertexAttribArray / glVertexAttribPointer с фиксированным конвейером. Это может сработать (я не уверен, я думаю, что атрибут 0 может быть псевдоним массива атрибутов вершины, но не уверен). Это не совсем правильно.

    Если у вас нет шейдера, вы должны использовать glEnableClientState и glVertexPointer для данных вершин.

    Цвет по умолчанию – (1,1,1,1), поэтому я думаю, что на данный момент вы должны быть в курсе цветов.