После того как параметры для достижения нужного эффекта выбраны, можно упростить шейдер, убрав специально добавленные для отладки параметры и заменяв их константами. Это сделает шейдер менее гибким, но более легким для понимания.

8.1.4. Упрощение

Про упрощение уже много говорилось в предыдущих главах. Простые шейдеры легче для понимания, их проще поддерживать. Обычно существует не один, а несколько алгоритмов, которые могут обеспечить нужный эффект. Выбран ли наиболее простой из них? Зачастую есть даже несколько способов реализации одного и того же алгоритма. Был ли выбран для реализации самый простой способ?

8.1.5. Модульность

Язык шейдеров OpenGL и его API поддерживает модульные шейдеры, так что можно воспользоваться их преимуществами. Придерживайтесь принципа «разделяй и властвуй»; лучше проектировать шейдер как набор маленьких простых модулей, которые будут работать совместно. Например, модули для вычисления освещения могут заменять друг друга и поддерживать как стандартные, так и дополнительно определенные источники освещения. Или есть несколько модулей - разных вариантов дымки. Если они правильно спроектированы, их можно смешивать и заменять один другим. Принцип модульности можно применять как для вершинных, так и для фрагментных шейдеров.

8.2. Анализ производительности

Разработанный по всем правилам шейдер может быть или не быть эффективным по времени выполнения. Рассмотрим некоторые приемы улучшения производительности хорошо сделанного шейдера.

https://smotri-sumerki.ru. https://mega-parnik.ru.

8.2.1. Частота вычислений

Вычисления могут выполняться в трех местах: на основном процессоре, на вершинном процессоре и на фрагментном процессоре. Привлекательным было бы выполнять большинство вычислений во фрагментном шейдере, поскольку он работает с каждым нарисованным пикселом, и поэтому картинка получается самого лучшего качества. Но если важна производительность, можно выполнять те же вычисления не во фрагментном, а в вершинном шейдере и получить приемлемое качество изображения, В результате фрагментный шейдер становится более быстрым. В некоторых случаях нет ощутимых различий между выполнением вычислений в вершинном шейдере или тех же вычислений во фрагментном шейдере, например, при вычислении эффекта дымки.

Один из способов улучшить производительность - реализовывать эффекты с быстро меняющимися характеристиками во фрагментном шейдере, а эффекты с плавно меняющимися характеристиками - в вершинном. Например, рассеянное освещение меняется плавно, так что можно вычислить его с приемлемым качеством в вершинном шейдере. Отражение, наоборот, надо рассчитывать во фрагментном шейдере, чтобы добиться хорошего качества. Общее правило таково: при плавном изменении характеристик можно использовать и значения, интерполированные между вершинами, в этом случае качество особо не пострадает. Фрагментный шейдер обычно выполняется большее количество раз, чем вершинный, за исключей нем случаев, когда выполняется рендеринг очень маленьких треугольников; так что будет разумным часть вычислений перенести в вершинный шейдер.


⇐ вернуться назад | | далее ⇒