Связывание текстур в OpenGL
Итак, я показываю свою сцену партиями, чтобы попытаться свести к минимуму изменения состояния.
Поскольку мои шейдеры обычно нуждаются в нескольких текстурах, у меня есть несколько из них, связанных одновременно с разными текстурами. Некоторые из этих текстур используются в нескольких партиях, поэтому могут даже оставаться связанными.
Теперь мой вопрос: прекрасно ли просто перевязывать все текстуры, которые мне нужны во время партии, хотя некоторые из них уже могут быть связаны? Или я должен проверить, какие из них связаны, и только привязать новые? Насколько дорогим является glBindTexture? Я использую шейдеры, плохо ли иметь неиспользуемые текстуры, привязанные к текстурным единицам, которые шейдер не будет отбирать, или я должен отпереть их?
Я в основном прошу "как сделать это быстро", а не "как".
EDIT: Помогло бы мне, если бы я предоставил код?
Ответы
Ответ 1
Ответ трудный, потому что любая сильная реализация GL должна сделать привязку уже привязанной текстуры no-op как оптимизацию. Вы должны попробовать бенчмаркинг, чтобы узнать, имеет ли значение какое-либо условие или нет.
То же самое относится и к неиспользуемым текстурам в текстурных единицах, поскольку реализация GL знает, какие текстурные единицы окончательно используются, это не должно влиять на производительность (как оптимизацию) на неиспользуемые текстурные единицы.
Ответ 2
Святое правило программирования GPU заключается в том, что чем меньше вы разговариваете с GPU, тем больше она вас любит.
glBindTexture намного дороже, чем проверка отдельного состояния на CPU, поэтому для частых изменений состояния, я думаю, вы должны увидеть, нужно ли переносить новый индекс текстуры на GPU.
Ответ 3
Отследите, какие текстуры вы привязали (не используйте glGet (GL_TEXTURE_BINDING_2D)) и только отсканируйте, если он изменится. Некоторые драйверы сделают это для вас, а некоторые - нет.
Если вы знаете, на какой платформе вы нацеливаетесь заранее, довольно легко сделать простой тест, чтобы увидеть, насколько он отличается.
Вы также можете сортировать свои партии по тем текстурам, которые они используют, чтобы свести к минимуму изменения текстуры.