Ограничение вершин в OpenGL - PullRequest
3 голосов
/ 19 августа 2011

У меня есть сцена OpenGL с тысячами вершин, и я хотел бы передать их как VBO / IBO.Выполнение команды glGetIntegerv (GL_MAX_ELEMENTS_VERTICES, & maxVertices) выявляет ограничение максимального количества вершин в 2048, несмотря на то, что у меня недавно установлена ​​видеокарта.В дополнение к этому, массив в C ограничен int, следовательно, максимум 32k вершин.

Как я могу обойти эти ограничения, чтобы в любом случае отображать все мои объекты?

Ответы [ 3 ]

5 голосов
/ 19 августа 2011

Константа GL_MAX_ELEMENTS_VERTICES применяется только к вызову glDrawRangeElements, и даже в этом случае значения, превышающие это значение, безусловно, не сделают glDrawRangeElements медленнее, чем glDrawElements. Не стоит разбивать пакеты вручную на более мелкие части, так как партии должны быть как можно большего размера и принимать вызовы как можно меньше. Просто забудьте об этом значении, оно больше не имеет никакого реального значения.

И, между прочим, я вполне уверен, что ваш int может содержать значения, намного превышающие 32 КБ, так как на современных платформах (по крайней мере, с графическими устройствами, поддерживающими VBO) int должен иметь ширину не менее 32 бит (и поэтому быть в состоянии держать такие значения, как 2G / 4G). Хотя на встроенном устройстве (использующем OpenGL ES) вы все равно можете ограничиться 16-битными индексами вершин.

2 голосов
/ 19 августа 2011

Разве GL_MAX_ELEMENTS_VERTICES просто не сообщает вам большинство вершин, которые можно передать за один вызов glDrawRangeElements?Есть ли причина, по которой вы не можете разбить свою сцену на биты и визуализировать биты один за другим?

1 голос
/ 19 августа 2011

Разделите ваше общее количество вершин на 2048 и создайте больше VBO

void glGenBuffersARB(GLsizei n, GLuint* ids)

Так что n будет (total / 2048) +1, а ids будет массивом GLuint, содержащим (total / 2048) +1

...