В настоящее время я создаю двигатель воксела (например, Minecraft), и я использую opengl.Как правильно использовать VAO и VBO в движке вокселя
В настоящее время конструкции двигателя выглядит следующим образом:
класса Map -> содержит 2d массива кусков (станд :: вектора станда :: вектора)
класса Chunk -> содержит 3d-массив блока (также с использованием std :: vector)
класс Блок -> содержит вершины блоков. (кубы, построенные от 12 треугольников);
Что я хочу сделать, так это сделать каждый кусок функцией draw(), которая будет рисовать все блоки в куске. Я думал, что сделаю буфер для каждого фрагмента, используя glGenBuffers(). Из учебников, которые я прочитал, следует сначала создать массив вершин с glVertexArray и связать его, а не привязать к нему буфер с целевым GL_ARRAY_BUFFER и заполнить его данными.
До сих пор мне удалось отобразить один кусок с помощью нескольких блоков, используя буфер, созданный в куске с помощью glGenBuffers(), но в основной функции я создаю glVertexArray и свяжу его, чем вызов функции draw() в кусок, и он связывает буфер и рисунок блока, используя glDrawArrays().
Вопрос в том, правильно ли создать VBO для каждого куска? Мне нужно создать glVertexArray для каждого фрагмента? или я должен использовать один для всех кусков и каждый раз связывать другой VBO?
Я попытался больше узнать о VAO и учебниках VBO throught и wiki, но до сих пор я не совсем понял, как это работает и как его следует использовать должным образом.
«std :: vector of std :: vector» ... Это, как правило, не очень эффективно для плотных 2D/3D-массивов. Переключитесь на что-то вроде ['boost.multiarray'] (http://www.boost.org/libs/multi_array/). – genpfault
Я бы рекомендовал не использовать метод draw для класса Block. Хотя это отличный пример инкапсуляции, он может быть очень неэффективным. В частности, для таких действий, как рендеринг, вам может потребоваться резервировать состояние (например, связывать VBOs, менять шейдерную форму и т. Д.) Избыточно в каждом методе 'draw', а инкапсуляция запрещает глобальное представление о том, как вы можете оптимизировать эту операцию. Посмотрите на [Шаблон посетителя] (http://en.wikipedia.org/wiki/Visitor_pattern), который описывает способ координации обхода ваших данных организованным образом. – radical7
Что это за функция 'glVertexArray()', о которой вы говорите? OpenGL имеет [вершинные массивы] (http://www.songho.ca/opengl/gl_vertexarray.html), [объекты массива вершин] (http://www.opengl.org/wiki/Vertex_Specification#Vertex_Array_Object) и [вершина буферных объектов] (http://www.songho.ca/opengl/gl_vbo.html). Ни один из них не использует нечто, называемое 'glVertexArray()'. Возможно, вы думаете о 'glGenVertexArrays()'? – genpfault