Но могу ли я быть уверен, что рендеринг без привязки VBO безопасен?
Вы не можете.
Профиль ядра спецификации OpenGL (3.2 и выше) явноутверждает, что это должно быть разрешено, что вы можете выполнять рендеринг со всеми отключенными атрибутами.Профиль совместимости спецификации OpenGL или любые версии до 3.2 точно так же ясно заявляют, что вы не можете сделать это.
Конечно, это все равно не имеет значения.Драйверы NVIDIA позволяют вам делать это с любой версией и профилем OpenGL.Драйверы ATI не позволяют вам делать это на любой версии OpenGL или в профиле.Они оба являются ошибками драйверов, просто по-разному.
Вы просто должны будете признать, что вам нужен фиктивный атрибут вершины.Однако:
Но мне нужно много вершин, и я не хочу хранить для них поддельные VBO (это занимает около 16 Мб памяти).
ПустышкаАтрибут будет занимать 4 байта (один с плавающей запятой или 4 вектора нормализованных байтов. Помните: вам нет дела до данных).Таким образом, вы можете разместить 4 миллиона из них в 16 МБ.
В качестве альтернативы, вы можете использовать инстансированный рендеринг через glDrawArraysInstanced.Там вы просто визуализируете одну вершину, но с num_vertices
экземплярами.Конечно, ваш шейдер должен будет использовать идентификатор экземпляра.