базовый чёрный экран opengl при добавлении IBO - PullRequest
0 голосов
/ 15 ноября 2018

Когда у меня есть только VBO и VAO, все работает нормально, но при добавлении IBO я получаю черный экран. Вот код:

инициализация:

GLuint vbo = 0;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);

GLuint  ibo;
glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float), NULL);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBindVertexArray(0);

внутри цикла:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(shader_programme);
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, 14, GL_UNSIGNED_INT, NULL);
glBindVertexArray(0);

вершин и признаков:

float   points[] = {
    -1.0, -1.0,  1.0,
    1.0, -1.0,  1.0,
    -1.0,  1.0,  1.0,
    1.0,  1.0,  1.0,
    -1.0, -1.0, -1.0,
    1.0, -1.0, -1.0,
    -1.0,  1.0, -1.0,
    1.0,  1.0, -1.0,
};

float   indices[] = {
    0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1
};

1 Ответ

0 голосов
/ 15 ноября 2018

5-й параметр glVertexAttribPointer - это смещение в байтах между последовательными общими атрибутами вершин.Если оно равно 0, то атрибуты вершин считаются плотно упакованными.

Ваши вершины состоят из трех компонентов типа float, поэтому stepde равно 3*sizeof(float):

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), NULL);

Поскольку вершины плотно упакованы, вы также можете передать 0 параметру:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);     

Тип индексов GL_UNSIGNED_INT.Тип индексного массива должен быть целым типом данных, который соответствует GL_UNSIGNED_INT.В вашем случае это должно быть unsigned int.

unsigned int indices[] = { .... }; 

Далее, тип примитива GL_TRIANGLES состоит из списка индексов, где каждый из 3 образует треугольник.Индексы 0, 1, 2 для ma треугольника, индексы 4, 5, 6 образуют следующий треугольник и так далее.Таким образом, число индексов должно делиться на 3.

Если вы хотите нарисовать куб, то список индексов может выглядеть так:

unsigned int indices[] = {
    0,1,2,    0,2,3,
    1,5,6,    1,6,2,
    5,4,7,    5,7,6,
    4,0,3,    4,3,7,
    3,2,6,    3,6,7,
    1,0,4,    1,4,5 
};

glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, NULL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...