Я хочу потянуть много сфер (~100k) использование OpenGL. До сих пор я делаю что-то как
for (int i=0; i<pnum; i++){
glPushMatrix();
glTranslatef(bpos[i].x, bpos[i].y, bpos[i].z);
glCallList(DListSPHERE);
glPopMatrix();
}
Перед использованием надлежащих сфер я использовал GL_POINTS
. Это позволило мне звонить glDrawArrays
с массивом, содержащим все точки, который был очень эффективен. Существует ли лучший путь, чем вышеупомянутый код для привлечения многих, одинаковых объектов?
Посмотрите на эту страницу на instancing: она содержит много ссылок:
Сделан некоторый тест, который показывает, когда использовать instancing, а когда нет: http://www.ozone3d.net/blogs/lab/?p=87
Реализация пседуо инстанцирования в OpenGL (рекомендуется для старого оборудования). glsl_pseudo_instancing.pdf
OpenGL instancing: http://www.opengl.org/registry/specs/EXT/draw_instanced.txt
См. также Инстанцирование геометрии в Википедии.
.Если нарисовать ~100k шаров, то вместо того, чтобы аппроксимировать их с помощью многоугольных сеток, можно рассмотреть возможность их лучеобразной аппроксимации. В работах GPU-основанное лучевое литье квадратичных поверхностей Сигг и др. (2006) и пластинчатое литье иллюминированных эллипсоидов с коррекцией глубины Гумхольда (2003), показано, как это сделать. Если вы сделаете это, то сможете повторно использовать большую часть вашего быстрого точечного спрайтового кода
.Вы можете использовать точечные спрайты и фрагмент шейдера, чтобы дублировать эффект от рендеринга сферы без реальной геометрии сферы. Однако сначала я бы попробовал инстанцировать.
.