Opengl, DrawArrays без привязки VBO - PullRequest
7 голосов
/ 07 ноября 2011

Я рендеринг массива точек с помощью пользовательского вершинного шейдера.Шейдеры выглядят так:

void mainVP()
in varying int    in_vertex_id : VERTEXID
{
    foo(in_vertex_id);
}

Так что единственное, что мне нужно, - это идентификатор вершины.Но мне нужно много вершин, и я не хочу хранить для них поддельные VBO (это занимает около 16 Мб памяти).

Я попытался запустить свой код без привязки к VBO.Оно работает.Итак, мой рендеринг выглядит так:

size_t num_vertices = ...
glDrawArrays(GL_POINTS, 0, num_vertices);

Но могу ли я быть уверен, что рендеринг без привязки VBO безопасен?

1 Ответ

11 голосов
/ 07 ноября 2011

Но могу ли я быть уверен, что рендеринг без привязки VBO безопасен?

Вы не можете.

Профиль ядра спецификации OpenGL (3.2 и выше) явноутверждает, что это должно быть разрешено, что вы можете выполнять рендеринг со всеми отключенными атрибутами.Профиль совместимости спецификации OpenGL или любые версии до 3.2 точно так же ясно заявляют, что вы не можете сделать это.

Конечно, это все равно не имеет значения.Драйверы NVIDIA позволяют вам делать это с любой версией и профилем OpenGL.Драйверы ATI не позволяют вам делать это на любой версии OpenGL или в профиле.Они оба являются ошибками драйверов, просто по-разному.

Вы просто должны будете признать, что вам нужен фиктивный атрибут вершины.Однако:

Но мне нужно много вершин, и я не хочу хранить для них поддельные VBO (это занимает около 16 Мб памяти).

ПустышкаАтрибут будет занимать 4 байта (один с плавающей запятой или 4 вектора нормализованных байтов. Помните: вам нет дела до данных).Таким образом, вы можете разместить 4 миллиона из них в 16 МБ.

В качестве альтернативы, вы можете использовать инстансированный рендеринг через glDrawArraysInstanced.Там вы просто визуализируете одну вершину, но с num_vertices экземплярами.Конечно, ваш шейдер должен будет использовать идентификатор экземпляра.

...