Если шейдер не использует другие атрибуты кроме позиции, железо не будет фетчить их из памяти. Всё уже давно оптимизировано.
v1c
Дык если всё в одном буфере, оно один хрен в кэш попадает.
Кстати, забыли ещё индексы и матрицы костей, если анимация, тоже надо для теней.
Dampire
> Попробуй, потом расскажешь. Заодно ботлнек замеришь где.
надо же, как быстро ты переобулся ))
Misanthrope
Во что я переобулся, валенок? Читай полностью пост, а не то, что тебе так хочется увидеть.
Dampire
> В таком случае что подразумевается под дроколлом не подскажешь? Потому что сам
> дрокол (который glDraw*) не стоит практически ничего, по сравнению со стейт
> чейнджами, которые как раз таки обычно нормально так оптимизируют в OpenGL (в
> том числе и redunant).
Так стейт ченджи и происходят как раз во время дро колла. Иначе как еще фильтровать redundant?
Поменял VAO с другим форматом вершин перед вызовом gl*Draw? Поменял альфа-бленд перед вызовом gl*Draw? Драйвер еще и микрокод шейдера будет патчить. Патчить - это в лучшем случае. В худшем - перекомпиливать из сорца.
Даже затредив вызовы, драйвер все равно все это будет делать, правда, уже в другом треде, чо.
Если шейдер не использует другие атрибуты кроме позиции, железо не будет фетчить их из памяти. Всё уже давно оптимизировано.
Кстати, да.
Если аттрибут присваивается переменной a, та присваивается b, а b нигде не используется и на конечный выхлоп не влияет - то все эти переменные будут отброшены, в том числе и атрибуты. Даже если они передаются в шейдер, но шейдер их не использует - расход на них будет ровно ноль. Даже если они передаются на каждом кадре.
Dampire
Да тут вообще все дураки, один ты умный. Кланиемся.
Wraith
> Так стейт ченджи и происходят как раз во время дро колла.
for(Mesh m: world->getStaticObjects())
{
glDrawElements(GL_TRIANGLES, m.indexquantity, GL_UNSIGNED_INT, (GLvoid *)(m.bufferstart* sizeof(GLuint)));
}
Где здесь стейт ченджи?
Пока рендеришь одним шейдером, одним стейтом, и одним форматом вершин, - действительно, все хорошо и прекрасно.
Wraith
Для остального - indirect buffer, multidraw* и ssbo, да. и всё это с двойной буферизацией.
Ну или vad и texelfetch из текстуры при отсутствии вышеуказанных фич.
Wraith
> Поменял VAO с другим форматом вершин перед вызовом gl*Draw? Поменял альфа-бленд
> перед вызовом gl*Draw? Драйвер еще и микрокод шейдера будет патчить. Патчить -
> это в лучшем случае. В худшем - перекомпиливать из сорц
очень может быть - ты про нормальные апи расскажи
Wraith
> Пока рендеришь одним шейдером, одним стейтом, и одним форматом вершин, -
> действительно, все хорошо и прекрасно.
ты что-то скатился до уровня каса
Wraith
В реальном проекте все это строится на нескольких шейдерах, остальные стейты кроме вао и текстур переключаются вместе с ними. В итоге сортируется по шейдерам, текстурам и получаем дешёвые дипы. Если у тебя разный формат вершин на каждый дип, то ты явно что-то делаешь не так.
nonamezerox
> Для остального - indirect buffer, multidraw* и ssbo, да. и всё это с двойной
> буферизацией.
>
> Ну или vad и texelfetch из текстуры при отсутствии вышеуказанных фич.
Все так! Непонятно только зачем при наличии всей этой радости цепляться за OpenGL.
Я понимаю, там, айфон пятый, андроеды старые, или еще что похуже. Но там даже ubo не работает толком, куда уж там ssbo и индирект.
f1ufx_
> Кстати, да.
Кстати не совсем. В кэш у тебя фетчится блок. Если вао состоит из монолитного буфера вместе с позициями в кэш влезут и все остальные данные. Если же ты собираешься вао из нескольких буферов, то тут бабушка надвое сказала (надо уточнять, я не секу).
Тема в архиве.