Точка 1 очевидна, так как сохраняет скорость заполнения. В случае, если примитивы задней стороны объекта обрабатываются первыми, эти грани будут опущены. Однако современные графические процессоры достаточно хорошо переносят оверрейд. Я однажды (GeForce8800 GTX) измерил оверрейд до 20%, прежде чем значительно снизился уровень производительности. Но лучше сохранить этот резерв для таких вещей, как отбор окклюзии, рендеринг смешанной геометрии и тому подобное.
Точка 2, совершенно бессмысленно. Матрицы никогда не рассчитывались на GPU - ну, если не считать SGI Onyx. Матрицы всегда представляли собой некий вид рендеринга глобальных параметров, рассчитанных на процессоре, а затем помещались в глобальные регистры на графическом процессоре, который теперь называется униформой, поэтому объединение с ними дает очень мало преимуществ. В шейдере, который сохраняет только одно дополнительное умножение векторной матрицы (сводится к 4 инструкциям MAD), за счет меньшей алгоритмической гибкости.
Точка 3 - это эффективность кеша. Данные, принадлежащие друг другу, должны помещаться в строку кэша.
Пункт 4 о предотвращении изменений состояния, уничтожающих кэши. Но это сильно зависит от того, какие GL называет они. Менять форму дешево. Переключение текстуры стоит дорого. Причина в том, что униформа находится в регистре, а не в кеше. Переключение шейдеров стоит дорого, потому что разные шейдеры демонстрируют разное поведение во время выполнения, что приводит к нарушению предварительных условий выполнения конвейера, изменению шаблонов доступа к памяти (и, следовательно, таким образом) и т. Д.
Но это все микрооптимизации (некоторые из них имеют огромное влияние). Тем не менее, я рекомендую взглянуть на значительную оптимизацию воздействия, например, реализовать ранний проход Z; использование запроса окклюзии в начале Z для быстрого различения целых геометрических партий. Одна большая оптимизация воздействия, которая по существу состоит из суммирования множества микрооптимизаций, подобных Point-4, заключается в сортировке пакетов рендеринга по дорогостоящим состояниям GL. Так что группируйте все с обычными шейдерами, внутри этих групп сортируйте по текстуре и так далее. Эта группировка состояний влияет только на видимые проходы рендеринга. В начале Z вы тестируете результаты только в буфере Z, так что есть только преобразование геометрии, и фрагментные шейдеры просто передадут значение Z.