Сижу такой и решил побенчить двигло своё, взял блендер и сделал модельку на 10 000 объектов вот она в таком виде у меня получается 10 000 поверхностей рендерящихся независимо друг от друга со своими VBO что хорошо для теста, а он плачевный. Ну во первых есть отсечение по пирамиде камеры оно спасает, но если 10000 объектов в прямой видимости то опять печать. Наткнулся на gl Query и пару статей о механизме работы для отсечения. Наладил в движке расширения написал простой рендер ну и делаю так (очень упрощённо)
//прямо в рендере один раз создаю для всех свои query
static GLuint query[10001], num_samples;
static bool once = true;
if(once){
glGenQueries(10001, query);
once=false;
}
for(int i = 0;i !=10000;i++)
{
GLuint gg = 0;
glGetQueryObjectuiv(query[i], GL_QUERY_RESULT, &gg);
if(gg == 0){
debug("[%i] drop",i);
}else{
debug("[%i] pass",i);
}
glBeginQuery(GL_SAMPLES_PASSED, query[i]);
render_render_object(i);//вызов отрисовки одного из 10000 кубиков
glEndQuery(GL_SAMPLES_PASSED);
glGetQueryObjectuiv(query[i], GL_QUERY_RESULT, &num_samples);
debug(">>>>>[%i] %d",i,num_samples);
}
Всё работает при уходе кубиков за край экрана пишет «drop» при перекрытии другими объектами пишет «drop» тоесть информация про то что объект рисовать нет смысла есть! Даже больше мы знаем сколько семплов есть в кадре от объекта и если их скажем меньше 1000 то мы можем сами просто выбрасывать его из отрисовки вообще, красота! Только вот беда, узнать то мы это можем только после того как уже отрисовали всё….
Единственная у меня сейчас мысль это перед тем как отрисовывать объект поставить в его место куб отмаштабировать его до размеров рисуемого меша, выполнить query тест отрисовки с этим кубом и если куб не прошол тест тоесть у нас ноль семплов куба в кадре то мы соотвецтвующей модели записываем флаг мол тебя не рисуем и когда объект будет передан рендеру он просто чекнет флаг и отрисует или выбросит объект. Вроде идея рабочея пока ещё не написал тест, но это работать будет инфа 120% пастеризованная, суть в другом правильно я мыслю как реализовывать occlusion query culling ? Ведь по моей логике я просто делаю шило на мыло, ну были бы у меня 10000 скажем чайников и я бы предварительно рисовал кубы узнавая надо ли мне рисовать чайник то выгода есть ибо 8 вершин против 800 к примеру. Мне кажется это не правильно проводить тест отрисовки на более лёгких мешах что бы узнавать надо ли рисовать основные меши со всеми текстурами и прочим. А если у меня исключительно аля маинкрафт и меньше куба только плоскость по сути и то вдруг у меня игра только на спрайтах в два треугольника. Может можно occlusion query culling делать без явной отрисовки чего либо?
OpenGL 2.1 GLSL #120
Только не надо про то что 10000 VBO и переключение текстур и всё это, да я знаю надо объединять меши и делать атласы текстур, тут про отсечение целиком, в сцене может быть 100 000 объектов независимых но рисоваться будут скажем только 100 при грамотной расстановке, а query culling по сути должен помочь отсечь то что закрывают собой другие объекты. Ток я не до конца догоняю как именно с этой хренью работать эффективно