Вот простое, но эффективное объяснение, в основном объект буфера имеет информацию, которую можно интерпретировать как просто биты необработанных данных, которые сами по себе ничего не значат, так что это ТОЧНО данные, которые действительно могут быть просмотрены любым способом
i.e float vbo[]={1.0,2.0,34.0...}
и способ, которым OpenGL был разработан для работы, заключается в том, что вы должны ОПРЕДЕЛИТЬ, как будут выглядеть данные, передаваемые вами в различные шейдеры.
в том, что вы также должны определить, как они будут читать эти данные, в каком формате, и что делать с ними, как они будут использоваться и для чего, вся эта информация хранится в VAO
например, вы можете объявить данные, которые хранятся в массиве, как это float vbo = {11.0,2.0,3.0,4.0}
то, что требуется затем на этом этапе, - это как интерпретировать эти данные из VBO в VAO, и что это означает следующим образом
VAO может быть установлен, чтобы читать 2 числа с плавающей точкой на вершину (что сделало бы это 2 векторами с двумя измерениями x, y), или вы можете сказать vao интерпретировать это как 1 вектор с 4 измерениями, то есть x, y, z, w и т. д.
но также другие атрибуты этих данных определяются и хранятся в VAO, такие как формат данных (несмотря на то, что вы объявили массив с плавающей точкой, вы можете указать шейдеру, что он будет считываться как целое число, и, конечно, система преобразует необработанные данные в процесс от числа с плавающей точкой до целого числа и имеет свой собственный набор правил, что делать в таких условиях)
Таким образом, в основном VBO - это данные, а VAO хранит, как интерпретировать эти данные, потому что шейдеры и сервер OpenGL спроектированы так, чтобы быть очень любопытными и должны знать все, прежде чем решат, как их обрабатывать, что с ними делать и где. поставить это
конечно, он не очень любопытный, он действительно выглядит наиболее эффективным, потому что ему нужно хранить эти данные в памяти графического сервера, чтобы он получал наиболее эффективную и быструю обработку (если он не решит, что ему не нужно делать это, если данные не должны обрабатываться таким образом и использоваться для некоторой другой информации, к которой часто не обращаются), и, следовательно, почему детали того, что делать с данными и как обрабатывать их, должны храниться в VAO, поэтому VAO похож на заголовок, а VBO - на чистые необработанные данные, которые заголовок использует и определяет (в этом случае передает атрибуты вершины шейдера), за исключением того, что VBO не ограничивается использованием только одной VAO. могут быть использованы и использованы повторно и связаны со многими VAO, например:
то, что вы можете сделать, это то, что вы можете привязать один буферный объект к VAO1, а также (отдельно) привязать один и тот же буферный объект к VAO2, причем каждый интерпретирует его по-разному, так что если ваш шейдер должен обрабатывать данные, в зависимости от того, какой VAO является тем, который является При связывании он будет обрабатывать одни и те же необработанные данные по-разному для мошенника (рисование пикселей в окне), что приведет к различному отображению одних и тех же данных, что будет зависеть от того, как вы определили их использование в VAO