LINUX.ORG.RU
ФорумGames

Объясните пожалуйта как работать с occlusion query culling, я чёт не догоняю

 , , , ,


0

1

Сижу такой и решил побенчить двигло своё, взял блендер и сделал модельку на 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 по сути должен помочь отсечь то что закрывают собой другие объекты. Ток я не до конца догоняю как именно с этой хренью работать эффективно

★★★★★

Последнее исправление: LINUX-ORG-RU (всего исправлений: 5)

Камоон, я знаю что тут есть матёрые openglщики lvl2500 =) Я спать, а когда проснусь надеюсь увидать пинок в нужную сторону

LINUX-ORG-RU ★★★★★
() автор топика

Насколько я знаю, query запускается заранее, можно параллельно что-то рисовать другое. Ну или считать.

mittorn ★★★★★
()
Последнее исправление: mittorn (всего исправлений: 1)

Это ж вроде легаси, зачем его использовать? Там 5 раз уже всё переписали и исправили с тех пор.

anonymous
()
Ответ на: комментарий от mittorn

Я вот именно этот момент и не догоняю, местами пишут что всё что выполняется в glBeginQuery … glEndQuery делается фейково чсто для расчётов что будет сделано, а не делать. И можно в начале фрейма сделать фейковый рендер, затем перейти к игровой логике, физике ,звуку, а только в конце фрейма при переходе к собственно рендеру узнавать какие привязанные к моделям Query объекты готовы и прошли тест видимости и на основе этого уже отбросить те модели коорые не надо рисовать…

Только вот как я гляжу своими глазами как это работает в реале то оно делает реальную отрисовку и уже потом через латентное время даёт информацию что прошло тест, а что нет именно из за этой латентности наверное имеется в виду что можно что-то делать паралельно, а не потому что оно не мешает основной отрисовке. Тоесть на следующий кадр на основе предыдущего я смогу сделать выводы стоит ли рисовать тот или иной объект, ну например если нет транформации матриц view/project то можель как была в предыдущем кадре не видима так и не будет. Но всё равно у меня уже три варианта как это использовать что-бы отсекать невидимое, но всё это палка о двух концах, или делать пререндер на low моделях и на их основе делать просчёт видимости до основного рендера, или делать предсказания на основе предыдущего кадра или делать фейковый и настоящий рендер первый для расчёта второй для отрисовки, только как я не понял. Ладно пойду гуглить. Инфа то есть, но скудная. И уж чего нет точно это того что на кринах когда часть меша модели скрыта и отсекаются вершины! вырезая перекрывающуюся геометрию на лету! Одна инициализация и простейшие примеры, а про сам принцип подробно чёт не найду ничего, опять мне велосипед чтоль придумывать? =)))))))

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Делай depth prepass. В современных реалиях это куда больше помогает. У тебя видюха загнётся от вершин или от сотни проходов фрагментного шейдера на каждый пиксель?
Ну а query видать просто в новых дровах нормально не реализован. Ну и для предыдущего кадра наверно сойдёт

mittorn ★★★★★
()
Ответ на: комментарий от anonymous

Оно есть во всех версиях от 1.1 до 4.6 по сути это просто сбор информации, для дебага, но это додумались использовать и для отсечения много лет назад. У меня 2.1 версия, ниже нет смысла выше 3.1 моя карта с модулем radeon не умеет. Ну и 2.1 это самый стандартный стандарт обычно если он есть то он есть на 100% в отличии от дропнутого в 1.1 или недоделанного в 3.1 и выше 3.3 там я молчу про 4.x на glsl 120 будет работать всё. Я ориентируюсь на нормальную работу на свободных дровах и mesa пока там чего-то нет то это для меня не нужно, разве что просто как задел на будущее.

LINUX-ORG-RU ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.