Неправильно прорисован порядок элементов в индексе буфера OpenGL - PullRequest
1 голос
/ 28 сентября 2019

enter image description here

Обратите внимание, как моя программа рисует один треугольник, но вместо этого я пытаюсь выразить в коде рисование квадрата.Мой tri_indicies индексный буферный объект, я считаю, правильно упорядочивает эти элементы так, что должен быть нарисован квадрат, но при выполнении программы порядок рисования, определенный мной в tri_indicies, не отражается в окне.Не уверен, коренится ли ошибка в tri_indicies, несмотря на то, что мои изменения в порядке элементов не влияют на мой обработанный вывод, я хочу верить, что это здесь, но, скорее всего, это где-то еще.

Моя программа использует абстракцииособенно VertexBuffer, VertexArray и IndexBuffer, все подробно описано ниже.

const int buffer_object_size = 8;
const int index_buffer_object_size = 6;
float tri_verticies[buffer_object_size] = {
    -0.7f, -0.7f, // 0
     0.7f, -0.7f, // 1
     0.7f,  0.7f, // 2
    -0.7f,  0.7f  // 3
};
unsigned int tri_indicies[index_buffer_object_size] = {
    0, 1, 2,
    2, 3, 0
};

VertexArray vertexArray;                
VertexBuffer vertexBuffer(tri_verticies, buffer_object_size * sizeof(float)); // no call vertexBuffer.bind() constructor does it    

VertexBufferLayout vertexBufferLayout;
vertexBufferLayout.push<float>(3);
vertexArray.add_buffer(vertexBuffer, vertexBufferLayout);

IndexBuffer indexBuffer(tri_indicies, index_buffer_object_size);        

ShaderManager shaderManager;
ShaderSource shaderSource = shaderManager.parse_shader("BasicUniform.shader");  // ensure debug working dir is relative to $(ProjectDir)
unsigned int shader = shaderManager.create_shader(shaderSource.vertex_source, shaderSource.fragment_source);
MyGLCall(glUseProgram(shader));

Позже в основном у меня есть цикл, который должен рисовать мой квадрат на экране и постепенно исчезать из значения синего цвета между 1.0f и0.0f.

while (!glfwWindowShouldClose(window))
{
    MyGLCall(glClear(GL_COLOR_BUFFER_BIT));

    vertexArray.bind();
    indexBuffer.bind();

    MyGLCall(glDrawElements(GL_TRIANGLES, index_buffer_object_size, GL_UNSIGNED_INT, nullptr)); // nullptr since we bind buffers using glGenBuffers

    if (blue > 1.0f) {
        increment_color = -0.05f;
    }
    else if (blue < 0.0f) {
        increment_color = 0.05f;
    }

    blue += increment_color;

    glfwSwapBuffers(window);
    glfwPollEvents();
}

1 Ответ

2 голосов
/ 28 сентября 2019

Массив tri_verticies состоит из координат вершин с 2 компонентами (x, y).Таким образом, размер кортежа для спецификации массива общих данных атрибута вершины должен быть 2, а не 3:

vertexBufferLayout.push<float>(3);
vertexBufferLayout.push<float>(2);

Что вы на самом деле делаете, так это указываете массив со следующими координатами:

-0.7, -0.7,  0.7 // 0
-0.7,  0.7,  0.7 // 1
 ???,  ???,  ??? // 2
 ???,  ???,  ??? // 3

Обычно внешний доступ к буферным объектам имеет неопределенные результаты.
См. OpenGL 4.6 API CoreСпецификация профиля - 6.4 Эффекты доступа к внешним границам буфера, стр. 79

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...