После того как параметры для достижения нужного эффекта выбраны, можно упростить шейдер, убрав специально добавленные для отладки параметры и заменяв их константами. Это сделает шейдер менее гибким, но более легким для понимания.
8.1.4. Упрощение
Про упрощение уже много говорилось в предыдущих главах. Простые шейдеры легче для понимания, их проще поддерживать. Обычно существует не один, а несколько алгоритмов, которые могут обеспечить нужный эффект. Выбран ли наиболее простой из них? Зачастую есть даже несколько способов реализации одного и того же алгоритма. Был ли выбран для реализации самый простой способ?
8.1.5. Модульность
Язык шейдеров OpenGL и его API поддерживает модульные шейдеры, так что можно воспользоваться их преимуществами. Придерживайтесь принципа «разделяй и властвуй»; лучше проектировать шейдер как набор маленьких простых модулей, которые будут работать совместно. Например, модули для вычисления освещения могут заменять друг друга и поддерживать как стандартные, так и дополнительно определенные источники освещения. Или есть несколько модулей - разных вариантов дымки. Если они правильно спроектированы, их можно смешивать и заменять один другим. Принцип модульности можно применять как для вершинных, так и для фрагментных шейдеров.
8.2. Анализ производительности
Разработанный по всем правилам шейдер может быть или не быть эффективным по времени выполнения. Рассмотрим некоторые приемы улучшения производительности хорошо сделанного шейдера.
8.2.1. Частота вычислений
Вычисления могут выполняться в трех местах: на основном процессоре, на вершинном процессоре и на фрагментном процессоре. Привлекательным было бы выполнять большинство вычислений во фрагментном шейдере, поскольку он работает с каждым нарисованным пикселом, и поэтому картинка получается самого лучшего качества. Но если важна производительность, можно выполнять те же вычисления не во фрагментном, а в вершинном шейдере и получить приемлемое качество изображения, В результате фрагментный шейдер становится более быстрым. В некоторых случаях нет ощутимых различий между выполнением вычислений в вершинном шейдере или тех же вычислений во фрагментном шейдере, например, при вычислении эффекта дымки.
Один из способов улучшить производительность - реализовывать эффекты с быстро меняющимися характеристиками во фрагментном шейдере, а эффекты с плавно меняющимися характеристиками - в вершинном. Например, рассеянное освещение меняется плавно, так что можно вычислить его с приемлемым качеством в вершинном шейдере. Отражение, наоборот, надо рассчитывать во фрагментном шейдере, чтобы добиться хорошего качества. Общее правило таково: при плавном изменении характеристик можно использовать и значения, интерполированные между вершинами, в этом случае качество особо не пострадает. Фрагментный шейдер обычно выполняется большее количество раз, чем вершинный, за исключей нем случаев, когда выполняется рендеринг очень маленьких треугольников; так что будет разумным часть вычислений перенести в вершинный шейдер.